From dabaf86f282defb8c3f66762482d4c022810079b Mon Sep 17 00:00:00 2001 From: kj Date: Sun, 20 Jul 2025 13:18:05 -0300 Subject: [PATCH] Big re-write :) I reordered the code in a more clean an organized way. Also this improves a lot the emacs startup time again, bucause after some updates it becomes a bit slow with the old configuration, so i did it again in a new way. --- .gitignore | 2 + configs/init-ai.el | 1 - configs/init-base.el | 236 +++++----- configs/{init-corfu.el => init-completion.el} | 53 ++- configs/init-ctags.el | 69 --- configs/init-editor.el | 153 +++++++ configs/init-evil.el | 9 +- configs/init-functions.el | 58 ++- configs/init-highlight.el | 164 +++++++ configs/init-keys.el | 8 +- configs/{init-eglot.el => init-lsp.el} | 53 ++- configs/init-minibuffer.el | 74 ++-- configs/init-org.el | 56 +-- configs/init-package.el | 78 ++++ configs/init-packages.el | 413 ------------------ configs/init-prog.el | 228 ++++++++++ configs/init-theme.el | 15 +- configs/init-ui.el | 148 +++++++ configs/init-utils.el | 241 ++++++++++ configs/init-vc.el | 98 +++-- configs/lang-go.el | 3 +- configs/lang-html.el | 6 +- configs/lang-js.el | 3 - configs/lang-php.el | 8 +- configs/lang-rust.el | 2 - early-init.el | 42 +- init.el | 40 +- private/.custom.el | 0 readme.org | 3 +- 29 files changed, 1426 insertions(+), 838 deletions(-) rename configs/{init-corfu.el => init-completion.el} (73%) delete mode 100644 configs/init-ctags.el create mode 100644 configs/init-editor.el create mode 100644 configs/init-highlight.el rename configs/{init-eglot.el => init-lsp.el} (60%) create mode 100644 configs/init-package.el delete mode 100644 configs/init-packages.el create mode 100644 configs/init-prog.el create mode 100644 configs/init-ui.el create mode 100644 configs/init-utils.el delete mode 100644 private/.custom.el diff --git a/.gitignore b/.gitignore index eab016d..7543413 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ workspace/ /.emacs.desktop /.tutor/ /intelephense/ +/auto-save-list/ +/*.eld diff --git a/configs/init-ai.el b/configs/init-ai.el index a68e743..38c7358 100644 --- a/configs/init-ai.el +++ b/configs/init-ai.el @@ -11,7 +11,6 @@ ;; Cliente LLM (ollama, chatgpt, gemini, etc.) (use-package gptel - :defer t :config ;; (setq gptel-model 'gemma3:4b ;; gptel-backend (gptel-make-ollama "Ollama" diff --git a/configs/init-base.el b/configs/init-base.el index 65adc89..0a8a6fe 100644 --- a/configs/init-base.el +++ b/configs/init-base.el @@ -6,10 +6,11 @@ ;;; Commentary: ;; Configuración general de Emacs. -;; No incluye paquetes/extensiones, solo configuraciones generales. ;;; Code: +(require 'init-functions) + ;; Native compilation (when (and (fboundp 'native-comp-available-p) (native-comp-available-p)) @@ -19,131 +20,136 @@ (setq package-native-compile t) )) -;; Instalar elpaca.el (reemplpazando package.el) -(defvar elpaca-installer-version 0.11) -(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 :depth 1 :inherit ignore - :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 (apply #'call-process `("git" nil ,buffer t "clone" - ,@(when-let* ((depth (plist-get order :depth))) - (list (format "--depth=%d" depth) "--no-single-branch")) - ,(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)) +;; Garbage Collector Magic Hack +(use-package gcmh + :diminish + :hook (emacs-startup . gcmh-mode) + :init + (setq gcmh-idle-delay 'auto + gcmh-auto-idle-delay-factor 10 + gcmh-high-cons-threshold #x1000000)) ; 16MB -;; 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)) +;; Guardar la posición del cursor en un archivo para volver allí cuando se lo vuelva a abrir. +(use-package saveplace + :ensure nil + :hook (after-init . save-place-mode)) -;; Block until current queue processed. -(elpaca-wait) +;; Recentf - Guarda registro de los archivos abiertos recientemente +(use-package recentf + :ensure nil + :bind (("C-x C-r" . recentf-open-files)) + :hook (after-init . recentf-mode) + :init (setq recentf-max-saved-items 300 + recentf-exclude + '("\\.?cache" ".cask" "url" "COMMIT_EDITMSG\\'" "bookmarks" + "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\|bmp\\|xpm\\)$" + "\\.?ido\\.last$" "\\.revive$" "/G?TAGS$" "/.elfeed/" + "^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/" + (lambda (file) (file-in-directory-p file package-user-dir)))) + :config + (push (expand-file-name recentf-save-file) recentf-exclude) + (add-to-list 'recentf-filename-handlers #'abbreviate-file-name)) -(defconst private-dir (expand-file-name "private" user-emacs-directory)) -(defconst temp-dir (format "%s/cache" private-dir) - "Hostname-based elisp temp directories.") +;; Guarda el historial del minibuffer +(use-package savehist + :ensure nil + :hook (after-init . savehist-mode) + :init (setq enable-recursive-minibuffers t ; Allow commands in minibuffers + history-length 1000 + savehist-additional-variables '(mark-ring + global-mark-ring + search-ring + regexp-search-ring + extended-command-history) + savehist-autosave-interval 300)) + +;; Misc. +(use-package simple + :ensure nil + :hook ((after-init . size-indication-mode) + (text-mode . visual-line-mode)) + :init + (setq column-number-mode t + line-number-mode t + kill-whole-line t ; Kill line including '\n' (C-k) + line-move-visual nil + track-eol t ; Keep cursor at end of lines. Require line-move-visual is nil. + set-mark-command-repeat-pop t) ; Repeating C-SPC after popping mark pops it again + ;; Visualize TAB, (HARD) SPACE, NEWLINE + (setq-default show-trailing-whitespace nil ; Don't show trailing whitespace by default + cursor-type 'bar) ; Usar la barrita como cursor + (setq show-trailing-whitespace t) + (add-hook 'before-save-hook #'delete-trailing-whitespace nil t) + ) ;; 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)) +(when (fboundp 'set-charset-priority) + (set-charset-priority 'unicode)) +(set-language-environment "UTF-8") +(set-default-coding-systems 'utf-8) +(set-buffer-file-coding-system 'utf-8) +(set-clipboard-coding-system 'utf-8) +(set-file-name-coding-system 'utf-8) +(set-keyboard-coding-system 'utf-8) +(set-next-selection-coding-system 'utf-8) +(set-selection-coding-system 'utf-8) +(set-terminal-coding-system 'utf-8) +(setq locale-coding-system 'utf-8) +(setq system-time-locale "C") -;; Emacs customizations -(when (display-graphic-p) - (scroll-bar-mode -1) ; Quitar scrollbar. - ) -(tooltip-mode -1) ; Disable tooltips. -(global-display-line-numbers-mode) ; Mostar número de línea. -(global-so-long-mode 1) ; Abrir archivos grandes o con líneas largas en el modo so-long por defecto. -(show-paren-mode 1) ; Habilitar resaltado de brackets. -;; (global-subword-mode 1) ; Habilitar subpalabras (detectar palabras dentro de un camelCase y Pascal case.) -(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) -;; Font por defecto - (set-face-attribute 'default nil :font "Fira Code Retina" :height 112) +;; Misc +(if (boundp 'use-short-answers) + (setq use-short-answers t) + (fset 'yes-or-no-p 'y-or-n-p)) +(setq-default major-mode 'text-mode + fill-column 80 + tab-width 4 + indent-tabs-mode nil) ; Permanently indent with spaces, never with TABs -;; 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))) +(setq visible-bell t + inhibit-compacting-font-caches t ; Don’t compact font caches during GC + delete-by-moving-to-trash t ; Deleting files go to OS's trash folder + make-backup-files nil ; Forbide to make backup files + auto-save-default nil ; Disable auto sav + inhibit-splash-screen t + uniquify-buffer-name-style 'post-forward-angle-brackets ; Show path if names are same + adaptive-fill-regexp "[ t]+|[ t]*([0-9]+.|*+)[ t]*" + adaptive-fill-first-line-regexp "^* *$" + sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*" + sentence-end-double-space nil + word-wrap-by-category 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) - (scroll-bar-mode -1) +;; Async +(use-package async + :functions (async-bytecomp-package-mode dired-async-mode) + :init + (async-bytecomp-package-mode 1) + (dired-async-mode 1)) - ;; Cerrar buffers al cerrar emacsclient - ;; (add-hook 'delete-frame-functions - ;; (lambda (frame) - ;; (mapc 'kill-buffer (delq (get-buffer "*dashboard*") (buffer-list))) - ;; )) - ) +;; Child frame +(use-package posframe + :hook (after-load-theme . posframe-delete-all) + :init + (defface posframe-border + `((t (:inherit region))) + "Face used by the `posframe' border." + :group 'posframe) + (defvar posframe-border-width 2 + "Default posframe border width.") + :config + (with-no-warnings + (defun my-posframe--prettify-frame (&rest _) + (set-face-background 'fringe nil posframe--frame)) + (advice-add #'posframe--create-posframe :after #'my-posframe--prettify-frame) -(if (daemonp) - (add-hook 'after-make-frame-functions - (lambda (frame) - (with-selected-frame frame - (setup-daemon)))) - (message "Corriendo en modo normal.")) + (defun posframe-poshandler-frame-center-near-bottom (info) + (cons (/ (- (plist-get info :parent-frame-width) + (plist-get info :posframe-width)) + 2) + (/ (+ (plist-get info :parent-frame-height) + (* 2 (plist-get info :font-height))) + 2))))) -(add-hook 'elpaca-after-init-hook (lambda () (load custom-file 'noerror))) (provide 'init-base) ;;; init-base.el ends here diff --git a/configs/init-corfu.el b/configs/init-completion.el similarity index 73% rename from configs/init-corfu.el rename to configs/init-completion.el index 00004aa..f576e81 100644 --- a/configs/init-corfu.el +++ b/configs/init-completion.el @@ -1,4 +1,4 @@ -;;; init-corfu.el --- Autocompletado con corfu -*- lexical-binding: t -*- +;;; init-completion.el --- Autocompletado con corfu -*- lexical-binding: t -*- ;; Author: kj ;; URL: https://git.kj2.me/kj/confi-emacs-actual @@ -15,15 +15,17 @@ ;;; Code: +;; childframe con los cantidatos de autocompletado (use-package corfu - :defer t :ensure (:files (:defaults "extensions/*") :includes (corfu-info corfu-history)) - :hook ((corfu-mode . corfu-popupinfo-mode)) + :hook ((elpaca-after-init . global-corfu-mode) + (global-corfu-mode . corfu-popupinfo-mode)) :bind (:map corfu-map - ("" . corfu-quit) ("" . corfu-quit) ("" . corfu-insert-separator)) + :custom-face + (corfu-border ((t (:inherit region :background unspecified)))) :custom (corfu-auto t) :config @@ -45,7 +47,6 @@ ;; Cambia la forma de mostrar y buscar sugerencias (afecta a corfu, pero también a otros como vertico). (use-package orderless - :defer t :after corfu :custom (completion-styles '(orderless)) ; Use orderless @@ -68,12 +69,10 @@ ;; Set de funciones de para las sugerencias de corfu. (use-package cape - :defer t :ensure (:host github :repo "minad/cape") :after corfu - :bind (("C-c f" . cape-file) - ("C-c l" . cape-line) - ("C-c _" . cape-tex)) + :bind (("C-c c f" . cape-file) + ("C-c c l" . cape-line)) :init (setq text-mode-ispell-word-completion nil) ;; (add-to-list 'completion-at-point-functions #'cape-line) ;; Completar línea actual en función de lo que dice otras líneas de buffer. @@ -92,19 +91,35 @@ (use-package corfu-terminal :after corfu :ensure (:repo "https://codeberg.org/akib/emacs-corfu-terminal.git") - :config + :init (corfu-terminal-mode +1)) ) -;; Iconos en corfu -(use-package kind-icon - :ensure t - :after corfu +;; A few more useful configurations... +(use-package emacs + :ensure nil :custom - (kind-icon-default-face 'corfu-default) ; to compute blended backgrounds correctly - :config - (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter)) + ;; TAB cycle if there are only few candidates + ;; (completion-cycle-threshold 3) + + ;; Enable indentation+completion using the TAB key. + ;; `completion-at-point' is often bound to M-TAB. + (tab-always-indent 'complete) + + ;; Emacs 30 and newer: Disable Ispell completion function. As an alternative, + ;; try `cape-dict'. + (text-mode-ispell-word-completion nil) + + ;; Emacs 28 and newer: Hide commands in M-x which do not apply to the current + ;; mode. Corfu commands are hidden, since they are not used via M-x. This + ;; setting is useful beyond Corfu. + (read-extended-command-predicate #'command-completion-default-include-p)) + +;; Iconos en corfu +(use-package nerd-icons-corfu + :after corfu + :init (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) -(provide 'init-corfu) -;;; init-corfu.el ends here +(provide 'init-completion) +;;; init-completion.el ends here diff --git a/configs/init-ctags.el b/configs/init-ctags.el deleted file mode 100644 index 8ea2ea7..0000000 --- a/configs/init-ctags.el +++ /dev/null @@ -1,69 +0,0 @@ -;;; init-ctags.el --- Configuracíón de TAGS -*- lexical-binding: t -*- - -;; Author: kj -;; URL: https://git.kj2.me/kj/confi-emacs-actual - -;;; Commentary: - -;;; Code: - -;; En esta sección está la configuración para ctags. -;; Quizá con la aparición de lsp sea menos necesaria, -;; pero dado a que sigue teniendo potencial para aportar -;; además de tener un rendimiento muy bueno es mejor -;; no dejarla de lado. - -;; Ctags IDE on the True Editor -;; @see https://github.com/universal-ctags/citre#quick-start - -(use-package citre - :defer t - :ensure t - :diminish - :bind (("C-x c ." . citre-jump) - ("C-x c ," . citre-jump-back) - ("C-x c p" . citre-peek) - ("C-x c a" . citre-ace-peek) - ("C-x c u" . citre-update-this-tags-file)) - :init - (setq citre-auto-enable-citre-mode-modes '(prog-mode) - citre-default-create-tags-file-location 'global-cache - citre-prompt-language-for-ctags-command t) - - :config - (with-no-warnings - ;; Integrate with `lsp-mode' and `eglot' - (define-advice xref--create-fetcher (:around (fn &rest args) fallback) - (let ((fetcher (apply fn args)) - (citre-fetcher - (let ((xref-backend-functions '(citre-xref-backend t))) - (ignore xref-backend-functions) - (apply fn args)))) - (lambda () - (or (with-demoted-errors "%s, fallback to citre" - (funcall fetcher)) - (funcall citre-fetcher))))) - - (defun lsp-citre-capf-function () - "A capf backend that tries lsp first, then Citre." - (let ((lsp-result (if (fboundp #'eglot-completion-at-point) - (eglot-completion-at-point) - (when (fboundp #'lsp-completion-at-point) - (lsp-completion-at-point))))) - (if (and lsp-result - (try-completion - (buffer-substring (nth 0 lsp-result) - (nth 1 lsp-result)) - (nth 2 lsp-result))) - lsp-result - (citre-completion-at-point)))) - - (defun enable-lsp-citre-capf-backend () - "Enable the lsp + Citre capf backend in current buffer." - (add-hook 'completion-at-point-functions #'lsp-citre-capf-function nil t)) - - (add-hook 'citre-mode-hook #'enable-lsp-citre-capf-backend) - )) - -(provide 'init-ctags) -;;; init-ctags.el ends here diff --git a/configs/init-editor.el b/configs/init-editor.el new file mode 100644 index 0000000..f1e4fb8 --- /dev/null +++ b/configs/init-editor.el @@ -0,0 +1,153 @@ +;; init-editor.el --- Initialize editing configurations. -*- lexical-binding: t -*- + +;; Copyright (C) 2006-2025 Vincent Zhang + +;; Author: kj +;; URL: https://git.kj2.me/kj/confi-emacs-actual + +;;; Commentary: +;; +;; Configuración en la edición de texto en general +;; + +;;; Code: + +;; Visor de documentos de emacs (soporta de todo: epub, pdf, odt, docx, cbz, etc.) +(use-package doc-view + :hook + (doc-view-mode . (lambda () + (display-line-numbers-mode 0))) + :ensure nil) + +;; Eliminar cuando está +(use-package delsel + :ensure nil + :hook (elpaca-after-init . delete-selection-mode)) + +;; Minor mode to aggressively keep your code always indented +(use-package aggressive-indent + :diminish + :autoload aggressive-indent-mode + :functions too-long-file-p + :hook ((elpaca-after-init . global-aggressive-indent-mode) + ;; NOTE: Disable in large files due to the performance issues + ;; https://github.com/Malabarba/aggressive-indent-mode/issues/73 + (find-file . (lambda () + (when (too-long-file-p) + (aggressive-indent-mode -1))))) + :config + ;; Disable in some modes + (dolist (mode '(gitconfig-mode + asm-mode web-mode html-mode + css-mode css-ts-mode + go-mode go-ts-mode + python-ts-mode yaml-ts-mode + scala-mode + shell-mode term-mode vterm-mode + prolog-inferior-mode)) + (add-to-list 'aggressive-indent-excluded-modes mode)) + + ;; Disable in some commands + (add-to-list 'aggressive-indent-protected-commands #'delete-trailing-whitespace t) + + ;; Be slightly less aggressive in C/C++/C#/Java/Go/Swift + (add-to-list 'aggressive-indent-dont-indent-if + '(and (derived-mode-p 'c-mode 'c++-mode 'csharp-mode + 'java-mode 'go-mode 'swift-mode) + (null (string-match "\\([;{}]\\|\\b\\(if\\|for\\|while\\)\\b\\)" + (thing-at-point 'line)))))) + +;; Mover líneas o regiones con M- +(use-package drag-stuff + :diminish + :autoload drag-stuff-define-keys + :hook (elpaca-after-init . drag-stuff-global-mode) + :config + (add-to-list 'drag-stuff-except-modes 'org-mode) + (drag-stuff-define-keys)) + +;; A comprehensive visual interface to diff & patch +(use-package ediff + :ensure nil + :hook(;; show org ediffs unfolded + (ediff-prepare-buffer . outline-show-all) + ;; restore window layout when done + (ediff-quit . winner-undo)) + :config + (setq ediff-window-setup-function 'ediff-setup-windows-plain + ediff-split-window-function 'split-window-horizontally + ediff-merge-split-window-function 'split-window-horizontally)) + +;; Automatic parenthesis pairing +(use-package elec-pair + :ensure nil + ;; :hook (elpaca-after-init . electric-pair-mode) + :init (setq electric-pair-inhibit-predicate 'electric-pair-conservative-inhibit)) + +;; Edit multiple regions in the same way simultaneously +(use-package iedit + :defines desktop-minor-mode-table + :bind (("C-;" . iedit-mode) + ("C-x r RET" . iedit-rectangle-mode) + :map isearch-mode-map ("C-;" . iedit-mode-from-isearch) + :map esc-map ("C-;" . iedit-execute-last-modification) + :map help-map ("C-;" . iedit-mode-toggle-on-function)) + :config + ;; Avoid restoring `iedit-mode' + (with-eval-after-load 'desktop + (add-to-list 'desktop-minor-mode-table + '(iedit-mode nil)))) + +;; Seleccionar por regiones (similar a mark-sexp, pero toma en cuenta hacia atrás del cursor también) +(use-package expand-region + :functions treesit-buffer-root-node + :bind ("C-=" . er/expand-region) + :config + (defun treesit-mark-bigger-node () + "Use tree-sitter to mark regions." + (let* ((root (treesit-buffer-root-node)) + (node (treesit-node-descendant-for-range root (region-beginning) (region-end))) + (node-start (treesit-node-start node)) + (node-end (treesit-node-end node))) + ;; Node fits the region exactly. Try its parent node instead. + (when (and (= (region-beginning) node-start) (= (region-end) node-end)) + (when-let* ((node (treesit-node-parent node))) + (setq node-start (treesit-node-start node) + node-end (treesit-node-end node)))) + (set-mark node-end) + (goto-char node-start))) + (add-to-list 'er/try-expand-list 'treesit-mark-bigger-node)) + +;; Hungry deletion (Elimina los espacios en blancos consecutivos) +(use-package hungry-delete + :diminish + :hook (elpaca-after-init . global-hungry-delete-mode) + :init (setq hungry-delete-chars-to-skip " \t\f\v" + hungry-delete-except-modes + '(help-mode minibuffer-mode minibuffer-inactive-mode calc-mode))) + +;; Mejora C-a y C-e para ir a lo que contextualmente sería el fin de la línea +(use-package mwim + :bind (([remap move-beginning-of-line] . mwim-beginning) + ([remap move-end-of-line] . mwim-end))) + +;; Ayuda a manipular los archivos con líneas demasiado largas +(use-package so-long + :ensure nil + :hook (after-init . global-so-long-mode) + :bind (:map so-long-mode-map + ("C-s" . isearch-forward) + ("C-r" . isearch-backward)) + :config + (setq so-long-variable-overrides + '((bidi-inhibit-bpa . t) + (bidi-paragraph-direction . left-to-right) + (buffer-read-only . nil) + (global-hl-line-mode . nil) + (line-move-visual . t) + (show-paren-mode . nil) + (truncate-lines . nil) + (which-func-mode . nil)))) + +(provide 'init-editor) +;;; init-editor.el ends here diff --git a/configs/init-evil.el b/configs/init-evil.el index 80bbc7b..5cf74fd 100644 --- a/configs/init-evil.el +++ b/configs/init-evil.el @@ -13,7 +13,6 @@ ;;; Code: (use-package evil - :defer t :hook ((elpaca-after-init . evil-mode) (git-timemachine-mode . evil-emacs-state)) :init @@ -81,7 +80,7 @@ ;; Expand region desde motion states (evil-define-key 'motion 'global (kbd "+") 'er/expand-region) - ;; Identado en motion modes. + ;; Indentado en motion modes. (evil-define-key 'motion 'global (kbd "") 'indent-for-tab-command) ;; Atajos con leader key para frames @@ -128,15 +127,11 @@ ;; Por ejemplo, para que evil-open-below funcione similar a org-return cuando ;; estamos dentro de una lista. (use-package evil-org - :ensure t - :defer t :after org :hook (org-mode . evil-org-mode)) ;; Similar a Vimtutor, pero para evil. -(use-package evil-tutor - :defer t - :ensure t) +(use-package evil-tutor) (provide 'init-evil) ;;; init-evil.el ends here diff --git a/configs/init-functions.el b/configs/init-functions.el index 908576d..851f8b0 100644 --- a/configs/init-functions.el +++ b/configs/init-functions.el @@ -43,9 +43,6 @@ (insert current-line) (decf n))))) -;; Borrar espacios, tabs y saltos de línea innecesarios al guardar -(add-hook 'before-save-hook 'delete-trailing-whitespace) - ;; Mostrar y ocultar el diff de la línea de git-gutter (defun git-gutter:toggle-popup-hunk () "Toggle 'git-gutter' hunk window." @@ -58,15 +55,15 @@ (defun kj/project-name (&optional project) "Return the name for PROJECT. If PROJECT is not specified, assume current project root." - (when-let (root (or project (kj/project-root))) + (when-let* ((root (or project (kj/project-root)))) ;; <-- ¡Aquí está el cambio! (file-name-nondirectory - (directory-file-name - (file-name-directory root))))) + (directory-file-name + (file-name-directory root))))) ;; Obtener la raíz del proyecto desde project.el (defun kj/project-root () "Return the current project root." - (when-let (project (project-current)) + (when-let* ((project (project-current))) (project-root project))) ;; Cambia entre ocultar o no la barra de título cuando está maximizado @@ -89,5 +86,52 @@ If PROJECT is not specified, assume current project root." "Run `after-load-theme-hook'." (run-hooks 'after-load-theme-hook)) +;; Devuelve si el archivo es muy grande o no\ +(defun too-long-file-p () + "Check whether the file is too long." + (or (> (buffer-size) 500000) + (and (fboundp 'buffer-line-statistics) + (> (car (buffer-line-statistics)) 10000)))) + +;; Renombrar el archivo actual +(defun rename-this-file (new-name) + "Renames both current buffer and file it's visiting to NEW-NAME." + (interactive "sNew name: ") + (let ((name (buffer-name)) + (filename (buffer-file-name))) + (unless filename + (error "Buffer '%s' is not visiting a file!" name)) + (progn + (when (file-exists-p filename) + (rename-file filename new-name 1)) + (set-visited-file-name new-name) + (rename-buffer new-name)))) + +;; Copiar el nombre del archivo actual +(defun copy-file-name () + "Copy the current buffer file name to the clipboard." + (interactive) + (let ((filename (if (equal major-mode 'dired-mode) + default-directory + (buffer-file-name)))) + (if filename + (progn + (kill-new filename) + (message "Copied '%s'" filename)) + (warn "Current buffer is not attached to a file!")))) + +;; Verifica si se puede levantar un childframe +(defun childframe-workable-p () + "Whether childframe is workable." + (and (not noninteractive) + (not emacs-basic-display) + (or (display-graphic-p) + (featurep 'tty-child-frames)) + (eq (frame-parameter (selected-frame) 'minibuffer) 't))) + +(defun font-installed-p (font-name) + "Check if font with FONT-NAME is available." + (find-font (font-spec :name font-name))) + (provide 'init-functions) ;;; init-functions.el ends here. diff --git a/configs/init-highlight.el b/configs/init-highlight.el new file mode 100644 index 0000000..1ae3f34 --- /dev/null +++ b/configs/init-highlight.el @@ -0,0 +1,164 @@ +;; init-highlight.el --- Initialize highlighting configurations. -*- lexical-binding: t -*- + +;; Author: kj +;; URL: https://git.kj2.me/kj/confi-emacs-actual + +;;; Commentary: +;; +;; Highlighting configurations. +;; + +;;; Code: + +;; Highlight the current line +(use-package hl-line + :ensure nil + :hook (((dashboard-mode eshell-mode shell-mode term-mode vterm-mode) . + (lambda () (setq-local global-hl-line-mode nil))) + ;; (after-init . global-hl-line-mode) + )) + +;; Highlight matching parens +(use-package paren + :ensure nil + :functions childframe-workable-p + :custom-face + (show-paren-match ((((class color) (background light)) + (:box (:line-width (-1 . -1) :color "gray73"))) + (((class color) (background dark)) + (:box (:line-width (-1 . -1) :color "gray56"))))) + :hook (after-init . show-paren-mode) + :init (setq show-paren-when-point-inside-paren t + show-paren-when-point-in-periphery t) + :config + (setq blink-matching-paren-highlight-offscreen t + show-paren-context-when-offscreen + (if (childframe-workable-p) 'child-frame 'overlay)) + (with-no-warnings + ;; Display matching line for off-screen paren. + (defun display-line-overlay (pos str &optional face) + "Display line at POS as STR with FACE. + +FACE defaults to inheriting from default and highlight." + (let ((ol (save-excursion + (goto-char pos) + (make-overlay (line-beginning-position) + (line-end-position))))) + (overlay-put ol 'display str) + (overlay-put ol 'face + (or face '(:inherit highlight))) + ol)) + + (defvar-local show-paren--off-screen-overlay nil) + (defun show-paren-off-screen (&rest _args) + "Display matching line for off-screen paren." + (when (overlayp show-paren--off-screen-overlay) + (delete-overlay show-paren--off-screen-overlay)) + ;; Check if it's appropriate to show match info, + (when (and (overlay-buffer show-paren--overlay) + (not (or cursor-in-echo-area + executing-kbd-macro + noninteractive + (minibufferp) + this-command)) + (and (not (bobp)) + (memq (char-syntax (char-before)) '(?\) ?\$))) + (= 1 (logand 1 (- (point) + (save-excursion + (forward-char -1) + (skip-syntax-backward "/\\") + (point)))))) + ;; Rebind `minibuffer-message' called by `blink-matching-open' + ;; to handle the overlay display. + (cl-letf (((symbol-function #'minibuffer-message) + (lambda (msg &rest args) + (let ((msg (apply #'format-message msg args))) + (setq show-paren--off-screen-overlay + (display-line-overlay + (window-start) msg )))))) + (blink-matching-open)))) + (advice-add #'show-paren-function :after #'show-paren-off-screen))) + +;; Resalta los escapes de secuencia +(use-package highlight-escape-sequences + :hook (prog-mode . hes-mode) + :config + (setq hes-mode-alist + `((c-mode . ,hes-c/c++/objc-escape-sequence-re) + (c++-mode . ,hes-c/c++/objc-escape-sequence-re) + (objc-mode . ,hes-c/c++/objc-escape-sequence-re) + (go-mode . ,hes-c/c++/objc-escape-sequence-re) + (php-mode . ,hes-c/c++/objc-escape-sequence-re) + (php-ts-mode . ,hes-c/c++/objc-escape-sequence-re) + (java-mode . ,hes-java-escape-sequence-re) + (clojure-mode . ,hes-java-escape-sequence-re) + (js-mode . ,hes-js-escape-sequence-re) + (js2-mode . ,hes-js-escape-sequence-re) + (ruby-mode . ,hes-ruby-escape-sequence-keywords) + (lisp-mode . ,hes-elisp-escape-sequence-re) + (lisp-interaction-mode . ,hes-elisp-escape-sequence-re) + (emacs-lisp-mode . ,hes-elisp-escape-sequence-re)) + ) + ) + +;; Resalta todas las ocurrencias del contenido seleccionado +(use-package region-occurrences-highlighter + :diminish + :bind (:map region-occurrences-highlighter-nav-mode-map + ("M-n" . region-occurrences-highlighter-next) + ("M-p" . region-occurrences-highlighter-prev)) + :hook (elpaca-after-init . global-region-occurrences-highlighter-mode)) + +;; Highlight indentions +(use-package indent-bars + :custom + (indent-bars-color '(highlight :face-bg t :blend 0.225)) + (indent-bars-highlight-current-depth '(:face default :blend 0.225)) + (indent-bars-color-by-depth nil) + (indent-bars-pattern ".") + (indent-bars-treesit-support t) + (indent-bars-no-descend-string t) + (indent-bars-treesit-ignore-blank-lines-types '("module")) + (indent-bars-prefer-character t) + (indent-bars-treesit-scope '((python function_definition class_definition for_statement + if_statement with_statement while_statement))) + ;; :hook ((prog-mode yaml-mode) . indent-bars-mode) + :config (require 'indent-bars-ts)) + +;; Colorize color names in buffers +(use-package colorful-mode + :diminish + :hook (after-init . global-colorful-mode) + :init (setq colorful-use-prefix t) + :config (dolist (mode '(html-mode php-mode help-mode helpful-mode)) + (add-to-list 'global-colorful-modes mode))) + +;; Highlight brackets according to their depth +(use-package rainbow-delimiters) + +;; Resaltar palabras clave como TODO, FIXME, etc. en comentarios del código. +(use-package hl-todo + :autoload hl-todo-flymake hl-todo-search-and-highlight + :functions rg rg-read-files rg-project + :bind (:map hl-todo-mode-map + ([C-f3] . hl-todo-occur)) + :hook (elpaca-after-init . global-hl-todo-mode) + :init (setq hl-todo-require-punctuation t + hl-todo-highlight-punctuation ":") + :config + (add-to-list 'hl-todo-keyword-faces '("BUG" . "#d99600")) + + ;; Integrate into flymake + (with-eval-after-load 'flymake + (add-hook 'flymake-diagnostic-functions #'hl-todo-flymake)) + + ;; Integrate into magit + (with-eval-after-load 'magit + (add-hook 'magit-log-wash-summary-hook + #'hl-todo-search-and-highlight t) + (add-hook 'magit-revision-wash-message-hook + #'hl-todo-search-and-highlight t)) + ) + +(provide 'init-highlight) +;;; init-highlight.el ends here diff --git a/configs/init-keys.el b/configs/init-keys.el index c1d919f..e49e483 100644 --- a/configs/init-keys.el +++ b/configs/init-keys.el @@ -28,18 +28,14 @@ (global-set-key (kbd "C-x mh") 'mhtml-mode) (global-set-key (kbd "C-x mj") 'js-mode) (global-set-key (kbd "C-x mp") 'php-ts-mode) -(global-set-key (kbd "C-x mr") 'rust-mode) (global-set-key (kbd "C-x mw") 'web-mode) ;; Cambiar de ventana (global-set-key (kbd "C-S-o") 'other-window) ;; Saltar entre párrafos -(define-key global-map "\M-p" 'backward-paragraph) -(define-key global-map "\M-n" 'forward-paragraph) - -;; Meta atajos (atajos de atajos) -;;(global-set-key (kbd "C-c l d") "\C-a\C- \C-n\M-w\C-y") ; Duplicar línea +(define-key global-map "\M-[" 'backward-paragraph) +(define-key global-map "\M-]" 'forward-paragraph) ;; Deactivar el abrir *messages* al cliquear en el minibuffer (define-key minibuffer-inactive-mode-map [mouse-1] #'ignore) diff --git a/configs/init-eglot.el b/configs/init-lsp.el similarity index 60% rename from configs/init-eglot.el rename to configs/init-lsp.el index 856f2c9..b56bc39 100644 --- a/configs/init-eglot.el +++ b/configs/init-lsp.el @@ -1,4 +1,4 @@ -;;; init-eglot.el --- Configuración de eglot (LSP) -*- lexical-binding: t -*- +;;; init-lsp.el --- Configuración de eglot (LSP) -*- lexical-binding: t -*- ;; Author: kj ;; URL: https://git.kj2.me/kj/confi-emacs-actual @@ -30,25 +30,43 @@ ;;; Code: (use-package eglot - :defer t :ensure nil - :hook ((css-mode . eglot-ensure) - (html-mode . eglot-ensure) - (php-mode . eglot-ensure) - (php-ts-mode . eglot-ensure) - (js-mode . eglot-ensure) - (tsx-ts-mode . eglot-ensure) - (typescript-ts-mode . eglot-ensure) - (rust-mode . eglot-ensure) - (sh-mode . eglot-ensure)) + :hook ((prog-mode . (lambda () + (unless (derived-mode-p + 'emacs-lisp-mode 'lisp-mode + 'makefile-mode 'snippet-mode + 'ron-mode) + (eglot-ensure)))) + ((markdown-mode yaml-mode yaml-ts-mode) . eglot-ensure)) + :init + (setq read-process-output-max (* 1024 1024)) ; 1MB + (setq eglot-autoshutdown t + eglot-events-buffer-size 0 + eglot-send-changes-idle-time 0.5) :config (setq eglot-sync-connect 0) - (add-to-list 'eglot-server-programs '(php-mode . ("intelephense" "--stdio"))) + ;; (add-to-list 'eglot-server-programs '(php-mode . ("intelephense" "--stdio"))) + + (add-to-list 'eglot-server-programs + '((tsx-ts-mode + ;; js-ts-mode + ;; js-mode + typescript-ts-mode + typescript-mode) + . + (eglot-deno "deno" "lsp"))) + + (defclass eglot-deno (eglot-lsp-server) () + :documentation "A custom class for deno lsp.") + + (cl-defmethod eglot-initialization-options ((server eglot-deno)) + "Passes through required deno initialization options" + (list :enable t + :lint t)) ) ;; Mejorar la velocidad de eglot (un binario en rust ) (use-package eglot-booster - :defer t :ensure (:host github :repo "jdtsmith/eglot-booster") :after eglot :config @@ -60,8 +78,6 @@ ;; Emmet (mientras veo como hacer funcionar emmet-ls) (use-package emmet-mode - :defer t - :after eglot :hook ((html-mode . emmet-mode) (web-mode . emmet-mode)) @@ -69,7 +85,6 @@ ;; Revisar por errores en el código (use-package flymake - :defer t :ensure nil :hook (prog-mode . (lambda () (unless (derived-mode-p 'makefile-mode) @@ -80,10 +95,8 @@ ;; Mostar los errores de flymake en un popup-tip (use-package flymake-diagnostic-at-point - :defer t - :ensure t :after flymake :hook (flymake-mode . flymake-diagnostic-at-point-mode)) -(provide 'init-eglot) -;;; init-eglot.el ends here +(provide 'init-lsp) +;;; init-lsp.el ends here diff --git a/configs/init-minibuffer.el b/configs/init-minibuffer.el index fdde958..8db76ff 100644 --- a/configs/init-minibuffer.el +++ b/configs/init-minibuffer.el @@ -10,26 +10,8 @@ ;;; Code: -;; UI para completado -(use-package vertico - :defer t - :bind (:map vertico-map - ("RET" . vertico-directory-enter) - ("DEL" . vertico-directory-delete-char) - ("TAB" . minibuffer-complete) - ("M-DEL" . vertico-directory-delete-word)) - :hook ((elpaca-after-init . vertico-mode) - (elpaca-after-init . savehist-mode) ;; savehist sirve para recordar el último comando de M-x - (rfn-eshadow-update-overlay . vertico-directory-tidy)) - :config - (setq read-file-name-completion-ignore-case t - read-buffer-completion-ignore-case t - completion-ignore-case t) - ) - ;; Reemplazo para counsel (use-package consult - :defer t :bind (("C-x p" . project-find-file) ("C-S-s" . consult-line) ("C-c r g" . consult-ripgrep) @@ -67,11 +49,11 @@ ("" . minibuffer-keyboard-quit) ;; Cacelar minibuffer con escape (más rápido que C-g) ("C-" . newline) ;; Insertar nueva línea estando en el minibufer (Mas rápido que C-q C-j) ("C-S-s" . (lambda () - "Insert the current symbol." - (interactive) - (insert (save-excursion - (set-buffer (window-buffer (minibuffer-selected-window))) - (or (thing-at-point 'symbol t) ""))))) ;; Al presionar por segunda ves C-s busca el símbolo actual. + "Insert the current symbol." + (interactive) + (insert (save-excursion + (set-buffer (window-buffer (minibuffer-selected-window))) + (or (thing-at-point 'symbol t) ""))))) ;; Al presionar por segunda ves C-s busca el símbolo actual. ) ;; Enable automatic preview at point in the *Completions* buffer. This is @@ -115,37 +97,39 @@ ;; You may want to use `embark-prefix-help-command' or which-key instead. (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help)) -;; nerd-icons en ibuffer -(use-package nerd-icons-ibuffer - :defer t - :hook (ibuffer-mode . nerd-icons-ibuffer-mode)) - ;; Descripciones en el minibufer (use-package marginalia - :defer t - :hook (elpaca-after-init . marginalia-mode)) - -;; Nerd icons para vertico -(use-package nerd-icons-completion - :after nerd-icons - :config (nerd-icons-completion-mode)) + :hook (vertico-mode . marginalia-mode)) ;; Todolist de todo el projecto desde consult. (use-package consult-todo :demand t - :bind ("C-c t" . consult-todo) - :defer t) + :bind ("C-c t" . consult-todo)) + +;; UI para completado del minibuffer +(use-package vertico + :bind (:map vertico-map + ("RET" . vertico-directory-enter) + ("DEL" . vertico-directory-delete-char) + ("TAB" . minibuffer-complete) + ("M-DEL" . vertico-directory-delete-word)) + :hook ((elpaca-after-init . vertico-mode) + (rfn-eshadow-update-overlay . vertico-directory-tidy)) + :config + (setq read-file-name-completion-ignore-case t + read-buffer-completion-ignore-case t + completion-ignore-case t) + ) ;; Mover el minibufer de vertico al centro de la pantalla. (use-package vertico-posframe - :after vertico - :config - (vertico-posframe-mode 1) - (setq vertico-posframe-border-width 1) - (setq vertico-posframe-parameters - '((left-fringe . 8) - (right-fringe . 8))) - ) + :functions posframe-poshandler-frame-center + :hook (vertico-mode . vertico-posframe-mode) + :init (setq vertico-posframe-poshandler + #'posframe-poshandler-frame-center + vertico-posframe-parameters + '((left-fringe . 8) + (right-fringe . 8)))) (provide 'init-minibuffer) ;;; init-minibuffer.el ends here diff --git a/configs/init-org.el b/configs/init-org.el index cadc111..74df8bc 100644 --- a/configs/init-org.el +++ b/configs/init-org.el @@ -21,38 +21,19 @@ "Configuración para el hook de 'org-mode'." (display-line-numbers-mode 0) - ;; (variable-pitch-mode 1) (visual-line-mode 1) (visual-fill-column-mode 1) ;; Configuracin para Systanx Highlight en porg-blocks (add-to-list 'org-src-lang-modes (cons "html" 'mhtml)) - ;; Configuración de fonts - ;; (set-face-attribute (car face) nil :font "Cantarell" :weight 'regular :height (cdr face)) - - ;; Ensure that anything that should be fixed-pitch in Org files appears that way - ;; (set-face-attribute 'org-hide nil :inherit 'fixed-pitch) - ;; (set-face-attribute 'org-block nil :foreground 'unspecified :inherit 'fixed-pitch) - ;; (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) (setq org-fontify-quote-and-verse-blocks t) ;; Permitir configuración de bloques quote y verse. - ;; (set-face-attribute 'org-block nil :underline nil :foreground nil :background "#282a36") - ;; (set-face-attribute 'org-block-begin-line nil :underline nil :foreground nil :background "#1e1f28") - ;; (set-face-attribute 'org-block-end-line nil :underline nil :foreground nil :background nil) - ;; (set-face-attribute 'org-block-end-line nil :background 'unspecified) (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch) - ;; (set-face-attribute 'org-block nil :background - ;; (color-darken-name - ;; (face-attribute 'default :background) 3)) - - ;; (setq org-src-block-faces '(("emacs-lisp" (:background "#EEE2FF")) - ;; ("python" (:background "#E5FFB8")))) - ;; Tachar los elementos "DONE" (set-face-attribute 'org-done nil :strike-through t) (set-face-attribute 'org-headline-done nil @@ -104,7 +85,6 @@ ;; org-mode (use-package org - :defer t :ensure nil :hook (org-mode . kj/org-hook) @@ -118,7 +98,7 @@ (setq org-log-into-drawer t) (setq org-cycle-separator-lines -1) - ;; Identación + ;; Indentación (setq org-startup-indented t) (setq org-src-preserve-indentation nil) (setq org-edit-src-content-indentation 0) @@ -188,7 +168,6 @@ ;; Los head "*" se ven como puntos (use-package org-bullets - :defer t :hook (org-mode . org-bullets-mode) :config @@ -204,8 +183,6 @@ ;; Mejora visualmente varias cosas de org (use-package org-modern - :defer t - :ensure t :hook ((org-mode . org-modern-mode) (org-agenda . org-modern-mode)) :config @@ -224,7 +201,6 @@ ) (use-package visual-fill-column - :defer t :after (org) :config ;; Tamaño de la columna @@ -237,10 +213,7 @@ ;; Segundo cerebro: Base de conocimientos en formato Zettelkasten (use-package org-roam - :defer t - :ensure t - :bind (("" . org-roam-node-insert) - ("" . org-roam-node-find)) + :bind ("" . org-roam-node-find) :init (setq org-roam-v2-ack t) (setq org-roam-completion-system 'ivy) @@ -252,8 +225,6 @@ ;; Interface web para navegar en mi base de conocimientos. (use-package org-roam-ui - :defer t - :ensure t :config (setq org-roam-ui-sync-theme t org-roam-ui-follow t @@ -262,33 +233,22 @@ ;; Continúa el formato de la lista cuando presionas enter. (use-package org-autolist - :defer t - :ensure t :hook (org-mode . org-autolist-mode)) ;; Org babel para PHP -(use-package ob-php - :defer t - :ensure t) +(use-package ob-php) ;; Org babel para GO -(use-package ob-go - :defer t - :ensure t) +(use-package ob-go) ;; Org babel para Rust -(use-package ob-rust - :defer t - :ensure t) +(use-package ob-rust) ;; Org babel para traducciones (mediante google translate) -(use-package ob-translate - :defer t - :ensure t) +(use-package ob-translate) ;; Org mode en modo presentación (use-package org-present - :defer t :after (org) :config (add-hook 'org-present-mode-hook @@ -316,12 +276,8 @@ ;; Mostrar los caracteres ocultos de org mode al pasar con el cursor. (use-package org-appear - :defer t ;; :hook (org-mode . org-appear-mode) ) -;; Polymode para org-mode -;; (use-package poly-org) - (provide 'init-org) ;;; init-org.el ends here diff --git a/configs/init-package.el b/configs/init-package.el new file mode 100644 index 0000000..b6dea63 --- /dev/null +++ b/configs/init-package.el @@ -0,0 +1,78 @@ +;;; init-package.el --- Initialize package configurations. -*- lexical-binding: t -*- + +;;; Commentary: +;; +;; Emacs Package management configurations. +;; + +;;; Code: + +;; Configuración de repositorios de paquetes + +(defvar elpaca-installer-version 0.11) +(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 :depth 1 :inherit ignore + :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 (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let* ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(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) + (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) +(add-hook 'after-init-hook #'elpaca-process-queues) +(elpaca `(,@elpaca-order)) + +;; Install use-package support +(elpaca elpaca-use-package + ;; Enable use-package :ensure support for Elpaca. + (elpaca-use-package-mode)) + +;; Should set before loading `use-package' +(setq use-package-always-ensure t + use-package-always-defer t + use-package-expand-minimally t + use-package-enable-imenu-support t) + +;; Required by `use-package' +(use-package diminish :ensure t) + +;; Update GPG keyring for GNU ELPA +(use-package gnu-elpa-keyring-update) + +;; Update packages +(unless (fboundp 'package-upgrade-all) + (use-package auto-package-update + :init + (setq auto-package-update-delete-old-versions t + auto-package-update-hide-results t) + (defalias 'package-upgrade-all #'auto-package-update-now))) + + +(provide 'init-package) +;;; init-package.el ends here diff --git a/configs/init-packages.el b/configs/init-packages.el deleted file mode 100644 index c7a31eb..0000000 --- a/configs/init-packages.el +++ /dev/null @@ -1,413 +0,0 @@ -;;; init-packages.el --- Extensiones/paquetes instalados y su configuración -*- lexical-binding: t -*- - -;; Author: kj -;; URL: https://git.kj2.me/kj/confi-emacs-actual - -;;; Commentary: - -;; Aquí se encuentran los paquetes de uso general. -;; -;; Aquellos de uso más específico, por ejemplo, los que -;; pertenecen a un lenguaje de programación en específico -;; estarán en el respectivo archivo de configuración -;; para dicho uso específico. - -;;; Code: - -;; Mejora del reemplazo -(use-package anzu - :defer t - :bind (([remap query-replace] . anzu-query-replace) - ([remap query-replace-regexp] . anzu-query-replace-regexp))) - -;; Intercamiar buffers de lugar -(use-package buffer-move - :defer 2 - :bind (("M-S-" . buf-move-up) - ("M-S-" . buf-move-down) - ("M-S-" . buf-move-left) - ("M-S-" . buf-move-right)) - ) - -;; Mostrar la ayuda de eldoc/documentación en un childframe -(use-package eldoc-box - :defer t - :bind ("" . eldoc-box-help-at-point)) - -;; Seleccionar por regiones (similar a mark-sexp, pero toma en cuenta hacia atrás del cursor también) -(use-package expand-region - :defer t - :bind (("C-+" . er/expand-region) - ("C-=" . er/expand-region))) - -;; Major mode para archivos CSV -(use-package csv-mode - :defer t - ;; :hook ((csv-mode . csv-align-mode) - ;; (csv-mode . csv-header-line)) - ) - -;; Visor de documentos de emacs (soporta de todo: epub, pdf, odt, docx, cbz, etc.) -(use-package doc-view - :defer t - :hook - (doc-view-mode . (lambda () - (display-line-numbers-mode 0))) - :ensure nil) - -;; Un bonito y sencillo panel de inicio -(use-package dashboard - :defer t - :config - (setq dashboard-set-file-icons t - dashboard-set-heading-icons t - dashboard-set-file-icons t - dashboard-week-agenda nil - dashboard-agenda-time-string-format "%Y-%m-%d %H:%M") - (setq dashboard-startup-banner - (expand-file-name "duck.svg" user-emacs-directory)) - (setq dashboard-items '( - ;; (recents . 10) - (agenda . 10) - )) - ) - -;; Coloca en emacs la documentacón distribuída por devdocs.io -(use-package devdocs - :defer 2) - -;; Sidebar a la derecha con los archivos -(use-package dired-sidebar - :defer t - :hook (dired-mode . hl-line-mode) - :bind ([f9] . dired-sidebar-toggle-sidebar) - :commands (dired-sidebar-toggle-sidebar) - :config - (setq dired-sidebar-theme 'nerd - ;; dired-sidebar-should-follow-file t - ;; dired-sidebar-follow-file-idle-delay 0.5 - )) - -;; La línea bonita esa de abajo -(use-package doom-modeline - :after emacs - :ensure t - :config - (doom-modeline-mode) - (setq doom-modeline-project-detection 'auto - doom-modeline-buffer-file-name-style 'relative-from-project - doom-modeline-major-mode-color-icon t - doom-modeline-buffer-modification-icon t - doom-modeline-indent-info nil - doom-modeline-persp-name t)) - -;; Modo para edición de arc docker compose -(use-package docker-compose-mode - :defer t) - -;; Modo para la edición de archivos Dockerfile (y building desde emacs) -(use-package dockerfile-mode - :defer t - :config - ;; Suelo tener podman siempre en lugar de docker, así que lo definimos como el comando a usar - (setq dockerfile-mode-command "podman")) - -;; Mover líneas o regiones -(use-package drag-stuff - :defer 1 - :config - (drag-stuff-global-mode) - (drag-stuff-define-keys)) - -;; Emparejamiento automático de comillas, paréntesis, corchetes y llaves -;; (use-package electric-pair -;; :defer t -;; :ensure nil -;; :config -;; (electric-pair-mode) -;; (setq electric-pair-delete-adjacent-pairs nil)) - -;; Cargar las variables de entorno desde la configuración del usuario -(use-package exec-path-from-shell - :config - (exec-path-from-shell-initialize)) - -;; Resalta los escapes de secuencia -(use-package highlight-escape-sequences - :defer t - :hook (prog-mode . hes-mode) - :config - (setq hes-mode-alist - `((c-mode . ,hes-c/c++/objc-escape-sequence-re) - (c++-mode . ,hes-c/c++/objc-escape-sequence-re) - (objc-mode . ,hes-c/c++/objc-escape-sequence-re) - (go-mode . ,hes-c/c++/objc-escape-sequence-re) - (php-mode . ,hes-c/c++/objc-escape-sequence-re) - (php-ts-mode . ,hes-c/c++/objc-escape-sequence-re) - (java-mode . ,hes-java-escape-sequence-re) - (clojure-mode . ,hes-java-escape-sequence-re) - (js-mode . ,hes-js-escape-sequence-re) - (js2-mode . ,hes-js-escape-sequence-re) - (ruby-mode . ,hes-ruby-escape-sequence-keywords) - (lisp-mode . ,hes-elisp-escape-sequence-re) - (lisp-interaction-mode . ,hes-elisp-escape-sequence-re) - (emacs-lisp-mode . ,hes-elisp-escape-sequence-re)) - ) - ) - -;; Resaltar palabras clave como TODO, FIXME, etc. en comentarios del código. -(use-package hl-todo - :ensure (hl-todo :version (lambda (_) "3.6.0")) - :defer t - :hook (prog-mode . hl-todo-mode) - :config - (add-to-list 'hl-todo-keyword-faces '("BUG" . "#d99600"))) - -;; Paquete para exportar buffers de emacs a HTML -(use-package htmlize - :defer t - :ensure t) - -;; Permite crear conjuntos de atajos. -(use-package hydra - :defer t) - -;; Mostrar lo que se está presionando en pantalla -(use-package keypression - :defer t - :config - (setq keypression-use-child-frame t - keypression-fade-out-delay 1.0 - keypression-frame-justify 'keypression-left-justified - keypression-cast-command-name t - keypression-cast-command-name-format "%s %s" - keypression-combine-same-keystrokes t - keypression-x-offset 50 - keypression-y-offset 100 - keypression-font-face-attribute '(:width normal :height 180 :weight bold)) - ) - -;; Modo markdown -(use-package markdown-mode - :defer t) - -;; Multiple vterm -(use-package multi-vterm - :defer t - :after vterm - :bind* (("" . multi-vterm-dedicated-toggle) - ("C-x tt" . multi-vterm-dedicated-toggle) - ("C-x tf" . multi-vterm) - ("C-x tp" . multi-vterm-project) - ;;("" . vterm-send-tab) - ) - :ensure t) - -;; Iconos bonitos para varias cosas -(use-package nerd-icons - :defer t) - -;; Usar nerd-icons en dired -(use-package nerd-icons-dired - :defer t - :after nerd-icons - :hook (dired-mode . nerd-icons-dired-mode)) - -;; Modo para leer archivos de configuración de nginx -(use-package nginx-mode - :defer t) - -;; Múltiples modos en un mismo buffer -;; (use-package polymode -;; :defer t) - -;; Des-minifica / ordena el código -(use-package prettier - :defer t) - -(use-package project - :defer t - :ensure nil - :config - ;; Colocamos un título del frame más bonito y útil que el por defecto - (setq frame-title-format - '( - (:eval - (let ((project-name (kj/project-name))) - (unless (null project-name) - (format "[%s] " project-name)))) - "%b" - " - Emacs") - ) -) - -;; Correr el código desde el buffer de emacs -(use-package quickrun - :defer t - :ensure t - :bind (:map prog-mode-map - ("C-c C-r" . quickrun) - ("C-c r f" . quickrun) - ("C-c r r" . quickrun-region) - ("C-c r R" . quickrun-replace-region) - ) - ) - -;; Recentf - Guarda registro de los archivos abiertos recientemente -(use-package recentf - :defer t - :ensure nil - :bind ("C-x C-r" . recentf-open-files) - :hook (after-load-theme . recentf-mode) - :config - (setq recentf-save-file - (recentf-expand-file-name (concat temp-dir "/recentf")) - recentf-auto-cleanup 'never - recentf-keep '(file-remote-p file-readable-p) - recentf-max-saved-items 1000 - recentf-max-menu-items 500)) - -;; Busqueda rápida con ripgrep -(use-package rg - :defer t - ;; :hook (elpaca-after-init . rg-enable-default-bindings) - :bind (:map rg-global-map - ("c" . rg-dwim-current-dir) - ("f" . rg-dwim-current-file) - ("m" . rg-menu)) - :config - (setq rg-group-result t - rg-show-columns t) - (cl-pushnew '("tmpl" . "*.tmpl") rg-custom-type-aliases)) - -;; Guardar la posición del cursor en un archivo para volver allí cuando se lo vuelva a abrir. -(use-package saveplace - :ensure nil - :defer t - :hook - (elpaca-after-init . (lambda() - (setq save-place-file (locate-user-emacs-file (concat temp-dir "/places"))) - (save-place-mode 1) - )) - ) - -;; Mejorando el scroll -(use-package smooth-scrolling - :defer t - :config - (smooth-scrolling-mode 1) - (setq mouse-wheel-scroll-amount - '(8 ((shift) . 1) ((control) . nil))) ; Cambia el scroll a 8 líneas a la vez, 1 cuando se preciona SHIFT y saltos de página cuando presionas CTRL - (setq mouse-wheel-progressive-speed nil) ; Deshabilita la velocidad progresiva del scroll (mientras más scroll haces, mas rápido va) - ) - -;; Ayuda a manipular los archivos con líneas demasiado largas -(use-package so-long - :defer t - :ensure nil - :bind (:map so-long-mode-map - ("C-s" . isearch-forward) - ("C-r" . isearch-backward)) - :config - (setq so-long-variable-overrides - '((bidi-inhibit-bpa . t) - (bidi-paragraph-direction . left-to-right) - (buffer-read-only . nil) - (global-hl-line-mode . nil) - (line-move-visual . t) - (show-paren-mode . nil) - (truncate-lines . nil) - (which-func-mode . nil))) - ) - -;; Mecanografía -(use-package speed-type - :defer t - :hook - (speed-type-mode . (lambda () - (corfu-mode 0) - (display-line-numbers-mode 0) - (visual-line-mode 1) - (visual-fill-column-mode 1))) - :diminish - :config - (setq speed-type-gb-book-list '(66867 66866 66591 57303 15725 24536) - speed-type-min-chars 300 - speed-type-max-chars 600)) - -;; Tree-sitter :) -(use-package treesit - :defer t - :ensure nil - :commands (treesit-install-language-grammar nf/treesit-install-all-languages) - :config - (setq treesit-language-source-alist - '((bash . ("https://github.com/tree-sitter/tree-sitter-bash")) - (c . ("https://github.com/tree-sitter/tree-sitter-c")) - (cpp . ("https://github.com/tree-sitter/tree-sitter-cpp")) - (css . ("https://github.com/tree-sitter/tree-sitter-css")) - (go . ("https://github.com/tree-sitter/tree-sitter-go")) - (haskell . ("https://github.com/tree-sitter/tree-sitter-haskell")) - (html . ("https://github.com/tree-sitter/tree-sitter-html")) - (java . ("https://github.com/tree-sitter/tree-sitter-java")) - (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript")) - (jsdoc . ("https://github.com/tree-sitter/tree-sitter-jsdoc")) - (json . ("https://github.com/tree-sitter/tree-sitter-json")) - (julia . ("https://github.com/tree-sitter/tree-sitter-julia")) - (lua . ("https://github.com/Azganoth/tree-sitter-lua")) - (make . ("https://github.com/alemuller/tree-sitter-make")) - (python . ("https://github.com/tree-sitter/tree-sitter-python")) - (php . ("https://github.com/tree-sitter/tree-sitter-php" "master" "php/src")) - (phpdoc . ("https://github.com/claytonrcarter/tree-sitter-phpdoc")) - (ruby . ("https://github.com/tree-sitter/tree-sitter-ruby")) - (rust . ("https://github.com/tree-sitter/tree-sitter-rust")) - (sql . ("https://github.com/m-novikov/tree-sitter-sql")) - (toml . ("https://github.com/tree-sitter/tree-sitter-toml")) - (tsx . ("https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src")) - (typescript . ("https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src")) - (zig . ("https://github.com/GrayJack/tree-sitter-zig")))) - (defun nf/treesit-install-all-languages () - "Install all languages specified by `treesit-language-source-alist'." - (interactive) - (let ((languages (mapcar 'car treesit-language-source-alist))) - (dolist (lang languages) - (treesit-install-language-grammar lang) - (message "`%s' parser was installed." lang) - (sit-for 0.75))))) - -;; Terminal -(use-package vterm - :defer 1 - :config - (setq tramp-histfile-override nil) ;; Dejamos que se use el history por defecto del servidor remoto - (setq vterm-tramp-shells '(("ssh" "/bin/bash") - ("sshx" "/bin/bash") - ("docker" "/bin/bash") - ("podman" "/bin/bash"))) ;; Tanto docker como podman usarán bash cuado se contecte mediante tramp - ) - -;; Cuando inicias un atajo de teclas te muestra las posibilidades -(use-package which-key - :defer t - :config - (which-key-mode)) - -;; Muestra which-key en un frame en el centro en lugar de abajo -(use-package which-key-posframe - :after which-key - :config - (which-key-posframe-mode)) - -;; Restaurar el estado de los frames -(use-package winner - :ensure nil - :defer t - :config - (winner-mode)) - -;; Emacs Start Up Profiler -;; (use-package esup -;; :defer t) - -(provide 'init-packages) -;;; init-packages.el ends here diff --git a/configs/init-prog.el b/configs/init-prog.el new file mode 100644 index 0000000..0ce9e94 --- /dev/null +++ b/configs/init-prog.el @@ -0,0 +1,228 @@ +;; init-prog.el --- Initialize programming configurations. -*- lexical-binding: t -*- + +;; Author: kj +;; URL: https://git.kj2.me/kj/confi-emacs-actual + +;;; Commentary: +;; +;; General programming configurations. +;; + +;;; Code: + +;; Show function arglist or variable docstring +(use-package eldoc + :ensure nil + :diminish + :config + (when (childframe-workable-p) + ;; Mostrar la ayuda de eldoc/documentación en un childframe + (use-package eldoc-box + :diminish (eldoc-box-hover-mode eldoc-box-hover-at-point-mode) + :bind ("" . eldoc-box-help-at-point) + :custom + (eldoc-box-lighter nil) + (eldoc-box-only-multi-line t) + (eldoc-box-clear-with-C-g t) + :custom-face + (eldoc-box-border ((t (:inherit posframe-border :background unspecified)))) + (eldoc-box-body ((t (:inherit tooltip)))) + :hook ((eglot-managed-mode . eldoc-box-hover-at-point-mode)) + :config + ;; Prettify `eldoc-box' frame + (setf (alist-get 'left-fringe eldoc-box-frame-parameters) 8 + (alist-get 'right-fringe eldoc-box-frame-parameters) 8)))) + + ;; Code folding indicators using Tree-sitter +(use-package treesit-fold-indicators + :ensure treesit-fold + :hook (after-init . global-treesit-fold-indicators-mode) + :init (setq treesit-fold-indicators-priority -1)) + +;; Cross-referencing commands +(use-package xref + :autoload xref-show-definitions-completing-read + :bind (("M-g ." . xref-find-definitions) + ("M-g ," . xref-go-back)) + :init + ;; Use faster search tool + (when (executable-find "rg") + (setq xref-search-program 'ripgrep)) + + ;; Select from xref candidates in minibuffer + (setq xref-show-definitions-function #'xref-show-definitions-completing-read + xref-show-xrefs-function #'xref-show-definitions-completing-read)) + +;; Code styles +(use-package editorconfig + :diminish + :hook (elpaca-after-init . editorconfig-mode)) + +;; Correr el código desde el buffer de emacs +(use-package quickrun + :bind (("C-" . quickrun) + ("C-S-" . quickrun-region))) + +;; Busqueda rápida con ripgrep +(use-package rg + :bind (:map rg-global-map + ("c" . rg-dwim-current-dir) + ("f" . rg-dwim-current-file) + ("m" . rg-menu)) + :config + (setq rg-group-result t + rg-show-columns t) + (cl-pushnew '("tmpl" . "*.tmpl") rg-custom-type-aliases)) + +;; Tree-sitter :) +(use-package treesit + :ensure nil + :commands (treesit-install-language-grammar nf/treesit-install-all-languages) + :config + (setq treesit-language-source-alist + '((bash . ("https://github.com/tree-sitter/tree-sitter-bash")) + (c . ("https://github.com/tree-sitter/tree-sitter-c")) + (cpp . ("https://github.com/tree-sitter/tree-sitter-cpp")) + (css . ("https://github.com/tree-sitter/tree-sitter-css")) + (go . ("https://github.com/tree-sitter/tree-sitter-go")) + (haskell . ("https://github.com/tree-sitter/tree-sitter-haskell")) + (html . ("https://github.com/tree-sitter/tree-sitter-html")) + (java . ("https://github.com/tree-sitter/tree-sitter-java")) + (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript")) + (jsdoc . ("https://github.com/tree-sitter/tree-sitter-jsdoc")) + (json . ("https://github.com/tree-sitter/tree-sitter-json")) + (julia . ("https://github.com/tree-sitter/tree-sitter-julia")) + (lua . ("https://github.com/Azganoth/tree-sitter-lua")) + (make . ("https://github.com/alemuller/tree-sitter-make")) + (python . ("https://github.com/tree-sitter/tree-sitter-python")) + (php . ("https://github.com/tree-sitter/tree-sitter-php" "master" "php/src")) + (phpdoc . ("https://github.com/claytonrcarter/tree-sitter-phpdoc")) + (ruby . ("https://github.com/tree-sitter/tree-sitter-ruby")) + (rust . ("https://github.com/tree-sitter/tree-sitter-rust")) + (sql . ("https://github.com/m-novikov/tree-sitter-sql")) + (toml . ("https://github.com/tree-sitter/tree-sitter-toml")) + (tsx . ("https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src")) + (typescript . ("https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src")) + (zig . ("https://github.com/GrayJack/tree-sitter-zig")))) + (defun nf/treesit-install-all-languages () + "Install all languages specified by `treesit-language-source-alist'." + (interactive) + (let ((languages (mapcar 'car treesit-language-source-alist))) + (dolist (lang languages) + (treesit-install-language-grammar lang) + (message "`%s' parser was installed." lang) + (sit-for 0.75))))) + +;; Browse devdocs.io documents using EWW +(use-package devdocs + :autoload (devdocs--installed-docs devdocs--available-docs) + :commands (devdocs-install devdocs-lookup) + :bind (:map prog-mode-map + ("M-" . devdocs-dwim) + ("C-h D" . devdocs-dwim)) + :init + (defconst devdocs-major-mode-docs-alist + '((c-mode . ("c")) + (c++-mode . ("cpp")) + (python-mode . ("python~3.10" "python~2.7")) + (ruby-mode . ("ruby~3.1")) + (rustic-mode . ("rust")) + (css-mode . ("css")) + (html-mode . ("html")) + (julia-mode . ("julia~1.8")) + (js-mode . ("javascript" "jquery")) + (emacs-lisp-mode . ("elisp"))) + "Alist of major-mode and docs.") + + (mapc + (lambda (mode) + (add-hook (intern (format "%s-hook" (car mode))) + (lambda () + (setq-local devdocs-current-docs (cdr mode))))) + devdocs-major-mode-docs-alist) + + (setq devdocs-data-dir (expand-file-name "devdocs" user-emacs-directory)) + + (defun devdocs-dwim() + "Look up a DevDocs documentation entry. + +Install the doc if it's not installed." + (interactive) + ;; Install the doc if it's not installed + (mapc + (lambda (slug) + (unless (member slug (let ((default-directory devdocs-data-dir)) + (seq-filter #'file-directory-p + (when (file-directory-p devdocs-data-dir) + (directory-files "." nil "^[^.]"))))) + (mapc + (lambda (doc) + (when (string= (alist-get 'slug doc) slug) + (devdocs-install doc))) + (devdocs--available-docs)))) + (alist-get major-mode devdocs-major-mode-docs-alist)) + + ;; Lookup the symbol at point + (devdocs-lookup nil (thing-at-point 'symbol t)))) + +;; --------------------------------------------------------------------------- +;; Miscellaneous Programming Modes +;; --------------------------------------------------------------------------- +(use-package csv-mode) +(unless emacs/>=29p + (use-package csharp-mode)) +(use-package cask-mode) +(use-package cmake-mode) +(use-package dart-mode) +(use-package julia-mode) +(use-package lua-mode) +(use-package mermaid-mode) +(use-package powershell) +(use-package scala-mode) +(use-package swift-mode) +(use-package v-mode) +(use-package vimrc-mode) +(use-package yaml-mode) ; Modo yaml +(use-package nginx-mode) ; Modo para leer archivos de configuración de nginx + +;; Major mode para archivos CSV +(use-package csv-mode + ;; :hook ((csv-mode . csv-align-mode) + ;; (csv-mode . csv-header-line)) + ) + +;; Modo markdown +(use-package markdown-mode) + +;; Modo para edición de arc docker compose +(use-package docker-compose-mode) + +;; Modo para la edición de archivos Dockerfile (y building desde emacs) +(use-package dockerfile-mode + :config + ;; Suelo tener podman siempre en lugar de docker, así que lo definimos como el comando a usar + (setq dockerfile-mode-command "podman")) + +;; Configuración para project.el +(use-package project + :ensure nil + :config + ;; Colocamos un título del frame más bonito y útil que el por defecto + (setq frame-title-format + '( + (:eval + (let ((project-name (kj/project-name))) + (unless (null project-name) + (format "[%s] " project-name)))) + "%b" + " - Emacs") + ) + ) + +(use-package prettier + :diminish + :defines prettier-pre-warm + :hook ((js-base-mode css-mode sgml-mode web-mode) . prettier-mode) + :init (setq prettier-pre-warm 'none)) + +;;; init-prog.el ends here diff --git a/configs/init-theme.el b/configs/init-theme.el index 4cfdc60..3fe273c 100644 --- a/configs/init-theme.el +++ b/configs/init-theme.el @@ -12,23 +12,18 @@ ;;; Code: ;; Theme dracula (https://draculatheme.com/) // aún lo tengo en l config porque a Ney le gusta -(use-package dracula-theme - :defer t) +(use-package dracula-theme) ;; El theme más cercano a adwaita dark que he encontrado -(use-package adwaita-dark-theme - :defer t) +(use-package adwaita-dark-theme) ;; Themes modus, vienen integrado en emacs en master (~v30) -(use-package modus-themes - :defer t) +(use-package modus-themes) ;; Themes ef (use-package ef-themes - :defer t) - -;; Prendemos el theme que elijamos -(add-hook 'elpaca-after-init-hook #'(lambda() (load-theme 'ef-dream t))) + :init + (load-theme 'ef-dream t)) ;; Los themes que recomiendo: ;; Oscuros: adwaita-dark y ef-dream diff --git a/configs/init-ui.el b/configs/init-ui.el new file mode 100644 index 0000000..6bf04cc --- /dev/null +++ b/configs/init-ui.el @@ -0,0 +1,148 @@ +;; init-ui.el --- Better lookings and appearances. -*- lexical-binding: t -*- + +;; Author: kj +;; URL: https://git.kj2.me/kj/confi-emacs-actual + +;;; Commentary: +;; +;; Visual (UI) configurations for better lookings and appearances. +;; + +;;; Code: + +;; Optimization +(setq idle-update-delay 1.0) + +(setq-default cursor-in-non-selected-windows nil) +(setq highlight-nonselected-windows nil) + +(setq fast-but-imprecise-scrolling t) +(setq redisplay-skip-fontification-on-input t) + +;; Sidebar a la derecha con los archivos +(use-package dired-sidebar + :hook (dired-mode . hl-line-mode) + :bind ([f9] . dired-sidebar-toggle-sidebar) + :commands (dired-sidebar-toggle-sidebar) + :config + (setq dired-sidebar-theme 'nerd + ;; dired-sidebar-should-follow-file t + ;; dired-sidebar-follow-file-idle-delay 0.5 + )) + + +;; Show line numbers +(use-package display-line-numbers + :ensure nil + :hook ((prog-mode + conf-mode toml-ts-mode + yaml-mode yaml-ts-mode) + . display-line-numbers-mode) + :init (setq display-line-numbers-width-start t)) + +;; Suppress GUI features +(setq use-file-dialog nil + use-dialog-box nil + inhibit-startup-screen t + inhibit-startup-echo-area-message user-login-name + inhibit-default-init t + initial-scratch-message nil) +(unless (daemonp) + (advice-add #'display-startup-echo-area-message :override #'ignore)) + +;; Display dividers between windows +(setq window-divider-default-places t + window-divider-default-bottom-width 1 + window-divider-default-right-width 1) +(add-hook 'window-setup-hook #'window-divider-mode) + + +;; Mouse & Smooth Scroll +;; Scroll one line at a time (less "jumpy" than defaults) +(when (display-graphic-p) + (setq mouse-wheel-scroll-amount '(1 ((shift) . hscroll)) + mouse-wheel-scroll-amount-horizontal 1 + mouse-wheel-progressive-speed nil)) +(setq scroll-step 1 + scroll-margin 0 + scroll-conservatively 100000 + auto-window-vscroll nil + scroll-preserve-screen-position t) + +;; Smooth scrolling +(use-package ultra-scroll + :hook (elpaca-after-init . ultra-scroll-mode)) + +;; Use fixed pitch where it's sensible +(use-package mixed-pitch + :diminish) + +;; Display ugly ^L page breaks as tidy horizontal lines +(use-package page-break-lines + :diminish + :hook (elpaca-after-init . global-page-break-lines-mode) + :config (dolist (mode '(dashboard-mode emacs-news-mode)) + (add-to-list 'page-break-lines-modes mode))) + +;; Transient +(when (childframe-workable-p) + ;; Display transient in child frame + (use-package transient-posframe + :diminish + :defines posframe-border-width + :custom-face + (transient-posframe ((t (:inherit tooltip)))) + (transient-posframe-border ((t (:inherit posframe-border :background unspecified)))) + :hook (after-init . transient-posframe-mode) + :init (setq transient-mode-line-format nil + transient-posframe-border-width posframe-border-width + transient-posframe-poshandler 'posframe-poshandler-frame-center + transient-posframe-parameters '((left-fringe . 8) + (right-fringe . 8))))) + +;; La línea bonita esa de abajo +(use-package doom-modeline + :init + (doom-modeline-mode) + (setq doom-modeline-project-detection 'auto + doom-modeline-buffer-file-name-style 'relative-from-project + doom-modeline-major-mode-color-icon t + doom-modeline-buffer-modification-icon t + doom-modeline-indent-info nil + doom-modeline-persp-name t)) + +(use-package hide-mode-line + :autoload turn-off-hide-mode-line-mode + :hook (((eat-mode + eshell-mode shell-mode + term-mode vterm-mode + embark-collect-mode lsp-ui-imenu-mode + pdf-annot-list-mode) . turn-on-hide-mode-line-mode))) + +;; A minor-mode menu for mode-line +(use-package minions + :hook (elpaca-after-init . minions-mode)) + +;; Iconos bonitos para varias cosas +(use-package nerd-icons + :commands nerd-icons-install-fonts + :functions font-installed-p + :config + (unless (font-installed-p nerd-icons-font-family) + (nerd-icons-install-fonts t))) + +;; nerd-icons en ibuffer +(use-package nerd-icons-ibuffer + :hook (ibuffer-mode . nerd-icons-ibuffer-mode)) + +;; Nerd icons para vertico +(use-package nerd-icons-completion + :hook (vertico-mode . nerd-icons-completion-mode)) + +;; Usar nerd-icons en dired +(use-package nerd-icons-dired + :after nerd-icons + :hook (dired-mode . nerd-icons-dired-mode)) + +(provide 'init-ui) +;;; init-ui.el ends here diff --git a/configs/init-utils.el b/configs/init-utils.el new file mode 100644 index 0000000..aa406ee --- /dev/null +++ b/configs/init-utils.el @@ -0,0 +1,241 @@ +;; init-utils.el --- Initialize ultilities. -*- lexical-binding: t -*- + +;; Author: kj +;; URL: https://git.kj2.me/kj/confi-emacs-actual + +;;; Commentary: +;; +;; Some usefule Utilities. +;; + +;;; Code: + +;; Mejora del reemplazo +(use-package anzu + :bind (([remap query-replace] . anzu-query-replace) + ([remap query-replace-regexp] . anzu-query-replace-regexp))) + +;; Intercamiar buffers de lugar +(use-package buffer-move + :bind (("M-S-" . buf-move-up) + ("M-S-" . buf-move-down) + ("M-S-" . buf-move-left) + ("M-S-" . buf-move-right)) + ) + +;; Cuando inicias un atajo de teclas te muestra las posibilidades +(use-package which-key + :diminish + :init (setq which-key-max-description-length 30 + which-key-lighter nil + which-key-show-remaining-keys t) + :autoload which-key-posframe-mode + :hook ( elpaca-after-init . which-key-mode)) + +;; Muestra which-key en un frame en el centro en lugar de abajo +(when (childframe-workable-p) + (use-package which-key-posframe + :diminish + :defines posframe-border-width + :functions posframe-poshandler-frame-center-near-bottom + :custom-face + (which-key-posframe ((t (:inherit tooltip)))) + (which-key-posframe-border ((t (:inherit posframe-border :background unspecified)))) + :init + (setq which-key-posframe-border-width posframe-border-width + which-key-posframe-poshandler #'posframe-poshandler-frame-center-near-bottom + which-key-posframe-parameters '((left-fringe . 8) + (right-fringe . 8))) + (which-key-posframe-mode 1))) + +;; Fast search tool `ripgrep' +(use-package rg + :hook (after-init . rg-enable-default-bindings) + :bind (:map rg-global-map + ("c" . rg-dwim-current-dir) + ("f" . rg-dwim-current-file) + ("m" . rg-menu)) + :init (setq rg-show-columns t) + :config (add-to-list 'rg-custom-type-aliases '("tmpl" . "*.tmpl"))) + +;; Process +(use-package proced + :ensure nil + :init + (setq-default proced-format 'verbose) + (setq proced-auto-update-flag t + proced-auto-update-interval 3 + proced-enable-color-flag t)) + +;; Paquete para exportar buffers de emacs a HTML +(use-package htmlize) + +;; eww +(use-package eww + :ensure nil + :init + ;; Install: npm install -g readability-cli + (when (executable-find "readable") + (setq eww-retrieve-command '("readable")))) + +;; Restaurar el estado de los frames +(use-package winner + :ensure nil + :config + (winner-mode)) + +;; Terminal +(use-package vterm + :config + (setq tramp-histfile-override nil) ;; Dejamos que se use el history por defecto del servidor remoto + (setq vterm-tramp-shells '(("ssh" "/bin/bash") + ("sshx" "/bin/bash") + ("docker" "/bin/bash") + ("podman" "/bin/bash"))) ;; Tanto docker como podman usarán bash cuado se contecte mediante tramp + ) + +;; Multiple vterm +(use-package multi-vterm + :after vterm + :bind* (("" . multi-vterm-dedicated-toggle) + ("C-x tt" . multi-vterm-dedicated-toggle) + ("C-x tf" . multi-vterm) + ("C-x tp" . multi-vterm-project) + ;;("" . vterm-send-tab) + )) + +;; Mecanografía +(use-package speed-type + :hook + (speed-type-mode . (lambda () + (corfu-mode 0) + (display-line-numbers-mode 0) + (visual-line-mode 1) + (visual-fill-column-mode 1))) + :diminish + :config + (setq speed-type-gb-book-list '(66867 66866 66591 57303 15725 24536) + speed-type-min-chars 300 + speed-type-max-chars 600)) + +;; Mostrar lo que se está presionando en pantalla +(use-package keypression + :config + (setq keypression-use-child-frame t + keypression-fade-out-delay 1.0 + keypression-frame-justify 'keypression-left-justified + keypression-cast-command-name t + keypression-cast-command-name-format "%s %s" + keypression-combine-same-keystrokes t + keypression-x-offset 50 + keypression-y-offset 100 + keypression-font-face-attribute '(:width normal :height 180 :weight bold)) + ) + +;; Un bonito y sencillo panel de inicio +(use-package dashboard + ;; :init + ;; (dashboard-setup-startup-hook) + :diminish dashboard-mode + :custom-face + (dashboard-heading ((t (:inherit (font-lock-string-face bold))))) + (dashboard-items-face ((t (:weight normal)))) + (dashboard-no-items-face ((t (:weight normal)))) + :config + (setq dashboard-set-file-icons t + dashboard-set-heading-icons t + dashboard-set-file-icons t + dashboard-week-agenda nil + dashboard-agenda-time-string-format "%Y-%m-%d %H:%M") + (setq dashboard-startup-banner + (expand-file-name "duck.svg" user-emacs-directory)) + (setq dashboard-items '( + ;; (recents . 10) + (agenda . 10) + )) + ) + +;; Hydra - Permite crear conjuntos de atajos. +(use-package hydra + :defines posframe-border-width + :functions childframe-workable-p + :hook (emacs-lisp-mode . hydra-add-imenu) + :init + (when (childframe-workable-p) + (setq hydra-hint-display-type 'posframe) + (with-no-warnings + (defun hydra-set-posframe-show-params () + "Set hydra-posframe style." + (setq hydra-posframe-show-params + `(:left-fringe 8 + :right-fringe 8 + :internal-border-width ,posframe-border-width + :internal-border-color ,(face-background 'posframe-border nil t) + :background-color ,(face-background 'tooltip nil t) + :foreground-color ,(face-foreground 'tooltip nil t) + :lines-truncate t + :poshandler posframe-poshandler-frame-center))) + (hydra-set-posframe-show-params) + (add-hook 'after-load-theme-hook #'hydra-set-posframe-show-params t)))) + +;; Pretty-Hydra - Su nombre ya indica lo que hace +(use-package pretty-hydra + :bind ("" . toggles-hydra/body) + :hook (emacs-lisp-mode . (lambda () + (add-to-list + 'imenu-generic-expression + '("Hydras" + "^.*(\\(pretty-hydra-define\\) \\([a-zA-Z-]+\\)" + 2)))) + :init + (cl-defun pretty-hydra-title (title &optional icon-type icon-name + &key face height v-adjust) + "Add an icon in the hydra title." + (let ((face (or face 'mode-line-emphasis)) + (height (or height 1.2)) + (v-adjust (or v-adjust 0.0))) + (concat + (when (and icon-type icon-name) + (let ((f (intern (format "nerd-icons-%s" icon-type)))) + (when (fboundp f) + (concat + (apply f (list icon-name :face face :height height :v-adjust v-adjust)) + " ")))) + (propertize title 'face face)))) + + ;; Global toggles + (with-no-warnings + (pretty-hydra-define toggles-hydra (:title (pretty-hydra-title "Toggles" 'faicon "nf-fa-toggle_on") + :color pink :quit-key ("q" "C-g")) + ("Basic" + (("n" (cond ((fboundp 'display-line-numbers-mode) + (display-line-numbers-mode (if display-line-numbers-mode -1 1))) + ((fboundp 'gblobal-linum-mode) + (global-linum-mode (if global-linum-mode -1 1)))) + "line number" + :toggle (or (bound-and-true-p display-line-numbers-mode) + (bound-and-true-p global-linum-mode))) + ("a" global-aggressive-indent-mode "aggressive indent" :toggle t) + ("d" global-hungry-delete-mode "hungry delete" :toggle t) + ("e" electric-pair-mode "electric pair" :toggle t) + ("s" prettify-symbols-mode "pretty symbol" :toggle t) + ("h" display-time-mode "time" :toggle t) + ("i" indent-bars-mode "indent bars" :toggle t)) + "Highlight" + (("l" global-hl-line-mode "line" :toggle t) + ("p" show-paren-mode "brackets pairs" :toggle t) + ("r" rainbow-delimiters-mode "rainbow brackets" :toggle t) + ("w" global-display-fill-column-indicator-mode "fill column indicator" :toggle t) + ("t" global-hl-todo-mode "todo" :toggle t)) + "Program" + (("f" flymake-mode "flymake" :toggle t) + ("c" flyspell-mode "spell check" :toggle t) + ("u" subword-mode "subword" :toggle t) + ("v" global-diff-hl-mode "gutter" :toggle t) + ("V" diff-hl-flydiff-mode "live gutter" :toggle t) + ("M" diff-hl-margin-mode "margin gutter" :toggle t) + ("D" diff-hl-dired-mode "dired gutter" :toggle t)) + )))) + +(provide 'init-utils) +;;; init-utils.el ends here diff --git a/configs/init-vc.el b/configs/init-vc.el index 539b9fc..99130e8 100644 --- a/configs/init-vc.el +++ b/configs/init-vc.el @@ -15,7 +15,6 @@ ;; Resolver diferencias entre 2 archivos o versiones del mismo. (use-package ediff - :defer t :ensure nil :config (setq ediff-diff-options "") @@ -23,48 +22,84 @@ (setq ediff-window-setup-function 'ediff-setup-windows-plain) (setq ediff-split-window-function 'split-window-vertically)) -;; Git Gutter - Marca a la izq. si una linea ha sido agregada, editada o eliminada desde el último commit. -(use-package git-gutter - :defer t +;; Marca a la izq. si una linea ha sido agregada, editada o eliminada desde el último commit. +(use-package diff-hl + :custom (diff-hl-draw-borders nil) + :autoload diff-hl-flydiff-mode + :custom-face + (diff-hl-change ((t (:inherit custom-changed :foreground unspecified :background unspecified)))) + (diff-hl-insert ((t (:inherit diff-added :background unspecified)))) + (diff-hl-delete ((t (:inherit diff-removed :background unspecified)))) + :bind (:map diff-hl-command-map + ("SPC" . diff-hl-mark-hunk)) + :hook ((elpaca-after-init . global-diff-hl-mode) + (elpaca-after-init . global-diff-hl-show-hunk-mouse-mode) + (dired-mode . diff-hl-dired-mode)) :config - (global-git-gutter-mode 1) - (defhydra hydra-git-gutter (:hint nil) - " - ^Navigation^ | ^Actions^ | ^Others^ --^-----------^-+-^----^--------+-^-------^---------- - _p_: previous | _s_: stage | _m_: mark - _n_: next | _r_: revert | _SPC_: toggle info --^-----------^-+-^----^--------+-^-------^---------- -" - ("p" git-gutter:previous-hunk) - ("n" git-gutter:next-hunk) - ("s" git-gutter:stage-hunk) - ("r" git-gutter:revert-hunk) - ("m" git-gutter:mark-hunkmark) - ("SPC" git-gutter:toggle-popup-hunk)) - ) + ;; Highlight on-the-fly + (diff-hl-flydiff-mode 1) + + ;; Set fringe style + (setq-default fringes-outside-margins t) + + (with-no-warnings + (unless (display-graphic-p) + ;; Fall back to the display margin since the fringe is unavailable in tty + (diff-hl-margin-mode 1) + ;; Avoid restoring `diff-hl-margin-mode' + (with-eval-after-load 'desktop + (add-to-list 'desktop-minor-mode-table + '(diff-hl-margin-mode nil)))) + + ;; Integration with magit + (with-eval-after-load 'magit + (add-hook 'magit-pre-refresh-hook #'diff-hl-magit-pre-refresh) + (add-hook 'magit-post-refresh-hook #'diff-hl-magit-post-refresh)))) ;; Visitar rápidamente viejas versiones de un archivo rápidamente (use-package git-timemachine - :defer t) + :custom-face + (git-timemachine-minibuffer-author-face ((t (:inherit success :foreground unspecified)))) + (git-timemachine-minibuffer-detail-face ((t (:inherit warning :foreground unspecified)))) + :bind (:map vc-prefix-map + ("t" . git-timemachine)) + :hook ((git-timemachine-mode . (lambda () + "Improve `git-timemachine' buffers." + ;; Display different colors in mode-line + (if (facep 'mode-line-active) + (face-remap-add-relative 'mode-line-active 'custom-state) + (face-remap-add-relative 'mode-line 'custom-state)) + + ;; Highlight symbols in elisp + (and (derived-mode-p 'emacs-lisp-mode) + (fboundp 'highlight-defined-mode) + (highlight-defined-mode t)) + + ;; Display line numbers + (and (derived-mode-p 'prog-mode 'yaml-mode) + (fboundp 'display-line-numbers-mode) + (display-line-numbers-mode t)))) + (before-revert . (lambda () + (when (bound-and-true-p git-timemachine-mode) + (user-error "Cannot revert the timemachine buffer")))))) ;; Generador automatizado de archivos de licencia -(use-package license-templates - :defer t) +(use-package license-templates) ;; Magia para git -(use-package magit - :defer t) +(use-package magit) ;; Todolist en magit de todos los archivos del projecto. (use-package magit-todos - :defer t - :config (magit-todos-mode 1)) + :after magit-status + :commands magit-todos-mode + :init + (setq magit-todos-nice (if (executable-find "nice") t nil)) + (magit-todos-mode 1)) ;; Modo para resolución de confictos (use-package smerge-mode :ensure nil - :defer t :config (defhydra hydra-smerge (:color pink :hint nil) @@ -96,14 +131,11 @@ _p_rev _u_pper _=_: upper/lower _r_esolve ("q" nil "cancel" :color blue)) ) -(use-package transient - :defer t) +(use-package transient) ;; Mostrar el último commit que modificó la linea actual (use-package vc-msg - :defer t - :bind (("C-c v" . vc-msg-show) - ("C-c C-v" . vc-msg-show)) + :bind (("C-c C-v" . vc-msg-show)) ) diff --git a/configs/lang-go.el b/configs/lang-go.el index 9c3c2a7..759784f 100644 --- a/configs/lang-go.el +++ b/configs/lang-go.el @@ -9,8 +9,7 @@ ;;; Code: -(use-package go-mode - :defer t) +(use-package go-mode) (provide 'lang-go) ;;; lang-go.el ends here diff --git a/configs/lang-html.el b/configs/lang-html.el index e54f483..cab8734 100644 --- a/configs/lang-html.el +++ b/configs/lang-html.el @@ -10,7 +10,6 @@ ;;; Code: (use-package web-mode - :defer t :config (setq web-mode-markup-indent-offset 2 web-mode-css-indent-offset 2 @@ -21,15 +20,12 @@ ) (use-package css-mode - :defer t :ensure nil :config (setq css-indent-offset 2)) (use-package auto-rename-tag - :ensure (:host github :repo "jcs-elpa/auto-rename-tag") - :defer t - ) + :ensure (:host github :repo "jcs-elpa/auto-rename-tag")) (provide 'lang-html) ;;; lang-html.el ends here diff --git a/configs/lang-js.el b/configs/lang-js.el index 964c4fb..a915f2b 100644 --- a/configs/lang-js.el +++ b/configs/lang-js.el @@ -10,7 +10,6 @@ ;;; Code: (use-package js - :defer t :ensure nil :mode ("\\.js$" . js-mode) @@ -22,8 +21,6 @@ ;; json-mode (use-package json-mode - :defer t - :ensure t :mode ("\\.json$" . json-mode) :config diff --git a/configs/lang-php.el b/configs/lang-php.el index 4bdd885..b2fa1c6 100644 --- a/configs/lang-php.el +++ b/configs/lang-php.el @@ -10,16 +10,10 @@ ;;; Code: (use-package php-ts-mode - :defer t :mode "\\.php\\'" - ;; :init - ;; (add-to-list 'auto-mode-alist '("\\.php\\'" . php-ts-mode)) - ;; :after php-mode :ensure nil) -;; (use-package php-mode -;; :defer t -;; :ensure t) +(use-package php-mode) (use-package php-doc-block :after php-ts-mode diff --git a/configs/lang-rust.el b/configs/lang-rust.el index 8b2bb6c..fa93501 100644 --- a/configs/lang-rust.el +++ b/configs/lang-rust.el @@ -10,8 +10,6 @@ ;;; Code: (use-package rust-mode - :defer t - :ensure t :init (setq rust-mode-treesitter-derive t) :config diff --git a/early-init.el b/early-init.el index d3d19e3..cb9f43e 100644 --- a/early-init.el +++ b/early-init.el @@ -20,23 +20,29 @@ ;; ;;; Code: -;; Disable GC during init -(put 'gc-cons-percentage 'original-value-before-init gc-cons-percentage) -(put 'gc-cons-percentage 'value-during-init 0.6) -(defun restore-gc-cons-percentage-after-init () - "Restaura el garbaje collection luego de iniciar." - (let ((expected-value (get 'gc-cons-percentage 'value-during-init)) - (value-to-restore (get 'gc-cons-percentage 'original-value-before-init))) - (when (and value-to-restore (equal gc-cons-percentage expected-value)) - (message "Setting `gc-cons-percentage' back to starting value %s" value-to-restore) - (setq gc-cons-percentage value-to-restore)))) -(add-hook 'after-init-hook #'restore-gc-cons-percentage-after-init) -(setq gc-cons-percentage (get 'gc-cons-percentage 'value-during-init)) +;; Defer garbage collection further back in the startup process +(setq gc-cons-threshold most-positive-fixnum) -;; Color de fondo similar al theme para evitar que se vea blanco al iniciar -;; (add-to-list 'default-frame-alist '(background-color . "#282a36")) +;; Prevent unwanted runtime compilation for gccemacs (native-comp) users; +;; packages are compiled ahead-of-time when they are installed and site files +;; are compiled when gccemacs is installed. +(setq native-comp-deferred-compilation nil ;; obsolete since 29.1 + native-comp-jit-compilation nil) -;; Permitir solo la búsqueda de archivos a cargar en la config en case sensitive. +;; 'use-package' is builtin since 29. +;; It must be set before loading 'use-package'. +(setq use-package-enable-imenu-support t) + +;; In noninteractive sessions, prioritize non-byte-compiled source files to +;; prevent the use of stale byte-code. Otherwise, it saves us a little IO time +;; to skip the mtime checks on every *.elc file. +(setq load-prefer-newer noninteractive) + +;; Explicitly set the prefered coding systems to avoid annoying prompt +;; from emacs (especially on Microsoft Windows) +(prefer-coding-system 'utf-8) + +;; Permitir solo la búsqueda de archivos a cargar en la carpeta config case sensitive. (setq auto-mode-case-fold nil) ;; Definimos que la shell por defecto será bash @@ -45,6 +51,12 @@ ;; Personalizaciones (Tedrían que ir en init-base, pero por optimización, las pongo acá) (push '(menu-bar-lines . 0) default-frame-alist) ; Quitar menús. (push '(tool-bar-lines . 0) default-frame-alist) ; Quitar toolbar. +(push '(vertical-scroll-bars) default-frame-alist) +(when (featurep 'ns) + (push '(ns-transparent-titlebar . t) default-frame-alist)) + +;; Prevent flash of unstyled mode line +(setq mode-line-format nil) ;; Iniciar emacs maximizado ;; (add-hook 'window-setup-hook 'toggle-frame-maximized t) ; Hacerlo mediante window-setup-hook (se maximiza al terminar de cargar la ventana) diff --git a/init.el b/init.el index fda6d33..1a191e5 100644 --- a/init.el +++ b/init.el @@ -9,21 +9,47 @@ ;;; Code: -;; Cargar configuraciones +;; Optimize Garbage Collection for Startup +(setq gc-cons-threshold most-positive-fixnum) -(add-to-list 'load-path (concat user-emacs-directory "configs")) +;; Optimize `auto-mode-alist` +(setq auto-mode-case-fold nil) + +(unless (or (daemonp) noninteractive init-file-debug) + ;; Temporarily suppress file-handler processing to speed up startup + (let ((default-handlers file-name-handler-alist)) + (setq file-name-handler-alist nil) + ;; Recover handlers after startup + (add-hook 'emacs-startup-hook + (lambda () + (setq file-name-handler-alist + (delete-dups (append file-name-handler-alist default-handlers)))) + 101))) + +;; Función para añadir 'config' a la ruta de carga código elisp de emacs +(defun update-load-path (&rest _) + "Update the `load-path` to prioritize personal configurations." + (push (expand-file-name "configs" user-emacs-directory) load-path)) + +;; Nos aseguramos de que ejecute 'update-load-path' antes de 'package-initialize' +(advice-add #'package-initialize :after #'update-load-path) + +;; Ahora lo corremos implícitamente +(update-load-path) ;; Paquetes base +(require 'init-package) (require 'init-base) +(require 'init-utils) +(require 'init-ui) +(require 'init-editor) +(require 'init-highlight) (require 'init-theme) -(require 'init-packages) -(require 'init-functions) (require 'init-ai) (require 'init-vc) (require 'init-org) -(require 'init-eglot) -(require 'init-corfu) -;; (require 'init-ctags) +(require 'init-lsp) +(require 'init-completion) (require 'init-minibuffer) ;; (require 'init-evil) (require 'init-keys) diff --git a/private/.custom.el b/private/.custom.el deleted file mode 100644 index e69de29..0000000 diff --git a/readme.org b/readme.org index e06bc13..7022084 100644 --- a/readme.org +++ b/readme.org @@ -41,7 +41,6 @@ Como ayuda lo más que puedo dar es que en las distros basadas en Debian puedes Normalmente no es usual el tener dependencias reales para que emacs funcione, pero para el funcionamiendo adecuado y sin errores, lo mejor es tener instalado: -- El font de firacode - cmake - libvterm @@ -53,7 +52,7 @@ Finalmente, recomiendo instalar [[https://github.com/blahgeek/emacs-lsp-booster] * Atajos de teclas personalizados -Tengo varios atajos reconfigurados, por lo que recomiento revisar primero que nada el archivo [[./configs/init-keys.el][init-keys.el]] el resto de configuraciones está principalmente en los archivos [[./configs/init-minibuffer.el][init-minibuffer.el]] e [[./configs/init-packages.el][init-packages.el]], dudo que las uses todas y yo mismo no las uso, por lo que con el tiempo las voy eliminando y a veces agrego alguna extra. Con que revises el primer archivo y sepas que =consult-project= está en =C-x p= ya estás servido. +Tengo varios atajos reconfigurados, por lo que recomiento revisar primero que nada el archivo [[./configs/init-keys.el][init-keys.el]] el resto de configuraciones está principalmente en los archivos [[./configs/init-minibuffer.el][init-minibuffer.el]] e [[file:configs/init-editor.el][init-editor.el]], dudo que las uses todas y yo mismo no las uso, por lo que con el tiempo las voy eliminando y a veces agrego alguna extra. Con que revises el primer archivo y sepas que =consult-project= está en =C-x p= ya estás servido. * Contacto