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

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