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.
This commit is contained in:
kj
2025-07-20 13:18:05 -03:00
parent 6ca3a756ad
commit dabaf86f28
29 changed files with 1426 additions and 838 deletions

2
.gitignore vendored
View File

@ -34,3 +34,5 @@ workspace/
/.emacs.desktop
/.tutor/
/intelephense/
/auto-save-list/
/*.eld

View File

@ -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"

View File

@ -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 ; Dont 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

View File

@ -1,4 +1,4 @@
;;; init-corfu.el --- Autocompletado con corfu -*- lexical-binding: t -*-
;;; init-completion.el --- Autocompletado con corfu -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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
("<tab>" . corfu-quit)
("<escape>" . corfu-quit)
("<SPC>" . 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

View File

@ -1,69 +0,0 @@
;;; init-ctags.el --- Configuracíón de TAGS -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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

153
configs/init-editor.el Normal file
View File

@ -0,0 +1,153 @@
;; init-editor.el --- Initialize editing configurations. -*- lexical-binding: t -*-
;; Copyright (C) 2006-2025 Vincent Zhang
;; Author: kj <webmaster@outcontrol.net>
;; 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-<teclas de dirección>
(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

View File

@ -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 "<leader>+") 'er/expand-region)
;; Identado en motion modes.
;; Indentado en motion modes.
(evil-define-key 'motion 'global (kbd "<tab>") '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

View File

@ -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.

164
configs/init-highlight.el Normal file
View File

@ -0,0 +1,164 @@
;; init-highlight.el --- Initialize highlighting configurations. -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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

View File

@ -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)

View File

@ -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 <webmaster@outcontrol.net>
;; 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

View File

@ -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 @@
("<escape>" . minibuffer-keyboard-quit) ;; Cacelar minibuffer con escape (más rápido que C-g)
("C-<return>" . 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

View File

@ -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 (("<f4>" . org-roam-node-insert)
("<f3>" . org-roam-node-find))
:bind ("<f3>" . 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

78
configs/init-package.el Normal file
View File

@ -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

View File

@ -1,413 +0,0 @@
;;; init-packages.el --- Extensiones/paquetes instalados y su configuración -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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-<up>" . buf-move-up)
("M-S-<down>" . buf-move-down)
("M-S-<left>" . buf-move-left)
("M-S-<right>" . buf-move-right))
)
;; Mostrar la ayuda de eldoc/documentación en un childframe
(use-package eldoc-box
:defer t
:bind ("<f1>" . 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* (("<f5>" . multi-vterm-dedicated-toggle)
("C-x tt" . multi-vterm-dedicated-toggle)
("C-x tf" . multi-vterm)
("C-x tp" . multi-vterm-project)
;;("<tab>" . 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

228
configs/init-prog.el Normal file
View File

@ -0,0 +1,228 @@
;; init-prog.el --- Initialize programming configurations. -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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 ("<f1>" . 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-<f5>" . quickrun)
("C-S-<f5>" . 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-<f1>" . 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

View File

@ -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

148
configs/init-ui.el Normal file
View File

@ -0,0 +1,148 @@
;; init-ui.el --- Better lookings and appearances. -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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

241
configs/init-utils.el Normal file
View File

@ -0,0 +1,241 @@
;; init-utils.el --- Initialize ultilities. -*- lexical-binding: t -*-
;; Author: kj <webmaster@outcontrol.net>
;; 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-<up>" . buf-move-up)
("M-S-<down>" . buf-move-down)
("M-S-<left>" . buf-move-left)
("M-S-<right>" . 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* (("<f5>" . multi-vterm-dedicated-toggle)
("C-x tt" . multi-vterm-dedicated-toggle)
("C-x tf" . multi-vterm)
("C-x tp" . multi-vterm-project)
;;("<tab>" . 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 ("<f6>" . 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

View File

@ -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))
)

View File

@ -9,8 +9,7 @@
;;; Code:
(use-package go-mode
:defer t)
(use-package go-mode)
(provide 'lang-go)
;;; lang-go.el ends here

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -10,8 +10,6 @@
;;; Code:
(use-package rust-mode
:defer t
:ensure t
:init
(setq rust-mode-treesitter-derive t)
:config

View File

@ -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)

40
init.el
View File

@ -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)

View File

View File

@ -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