;; init-editor.el --- Initialize editing configurations. -*- lexical-binding: t -*- ;; Copyright (C) 2006-2025 Vincent Zhang ;; Author: kj ;; URL: https://git.kj2.me/kj/confi-emacs-actual ;;; Commentary: ;; ;; Configuración en la edición de texto en general ;; ;;; Code: ;; Visor de documentos de emacs (soporta de todo: epub, pdf, odt, docx, cbz, etc.) (use-package doc-view :hook (doc-view-mode . (lambda () (display-line-numbers-mode 0))) :ensure nil) ;; Eliminar cuando está (use-package delsel :ensure nil :hook (elpaca-after-init . delete-selection-mode)) ;; Minor mode to aggressively keep your code always indented (use-package aggressive-indent :diminish :autoload aggressive-indent-mode :functions too-long-file-p :hook ((elpaca-after-init . global-aggressive-indent-mode) ;; NOTE: Disable in large files due to the performance issues ;; https://github.com/Malabarba/aggressive-indent-mode/issues/73 (find-file . (lambda () (when (too-long-file-p) (aggressive-indent-mode -1))))) :config ;; Disable in some modes (dolist (mode '(gitconfig-mode asm-mode web-mode html-mode css-mode css-ts-mode go-mode go-ts-mode python-ts-mode yaml-ts-mode scala-mode shell-mode term-mode vterm-mode prolog-inferior-mode)) (add-to-list 'aggressive-indent-excluded-modes mode)) ;; Disable in some commands (add-to-list 'aggressive-indent-protected-commands #'delete-trailing-whitespace t) ;; Be slightly less aggressive in C/C++/C#/Java/Go/Swift (add-to-list 'aggressive-indent-dont-indent-if '(and (derived-mode-p 'c-mode 'c++-mode 'csharp-mode 'java-mode 'go-mode 'swift-mode) (null (string-match "\\([;{}]\\|\\b\\(if\\|for\\|while\\)\\b\\)" (thing-at-point 'line)))))) ;; Mover líneas o regiones con M- (use-package drag-stuff :diminish :autoload drag-stuff-define-keys :hook (elpaca-after-init . drag-stuff-global-mode) :config (add-to-list 'drag-stuff-except-modes 'org-mode) (drag-stuff-define-keys)) ;; A comprehensive visual interface to diff & patch (use-package ediff :ensure nil :hook(;; show org ediffs unfolded (ediff-prepare-buffer . outline-show-all) ;; restore window layout when done (ediff-quit . winner-undo)) :config (setq ediff-window-setup-function 'ediff-setup-windows-plain ediff-split-window-function 'split-window-horizontally ediff-merge-split-window-function 'split-window-horizontally)) ;; Automatic parenthesis pairing (use-package elec-pair :ensure nil ;; :hook (elpaca-after-init . electric-pair-mode) :init (setq electric-pair-inhibit-predicate 'electric-pair-conservative-inhibit)) ;; Edit multiple regions in the same way simultaneously (use-package iedit :defines desktop-minor-mode-table :bind (("C-;" . iedit-mode) ("C-x r RET" . iedit-rectangle-mode) :map isearch-mode-map ("C-;" . iedit-mode-from-isearch) :map esc-map ("C-;" . iedit-execute-last-modification) :map help-map ("C-;" . iedit-mode-toggle-on-function)) :config ;; Avoid restoring `iedit-mode' (with-eval-after-load 'desktop (add-to-list 'desktop-minor-mode-table '(iedit-mode nil)))) ;; Seleccionar por regiones (similar a mark-sexp, pero toma en cuenta hacia atrás del cursor también) (use-package expand-region :functions treesit-buffer-root-node :bind ("C-=" . er/expand-region) :config (defun treesit-mark-bigger-node () "Use tree-sitter to mark regions." (let* ((root (treesit-buffer-root-node)) (node (treesit-node-descendant-for-range root (region-beginning) (region-end))) (node-start (treesit-node-start node)) (node-end (treesit-node-end node))) ;; Node fits the region exactly. Try its parent node instead. (when (and (= (region-beginning) node-start) (= (region-end) node-end)) (when-let* ((node (treesit-node-parent node))) (setq node-start (treesit-node-start node) node-end (treesit-node-end node)))) (set-mark node-end) (goto-char node-start))) (add-to-list 'er/try-expand-list 'treesit-mark-bigger-node)) ;; Hungry deletion (Elimina los espacios en blancos consecutivos) (use-package hungry-delete :diminish :hook (elpaca-after-init . global-hungry-delete-mode) :init (setq hungry-delete-chars-to-skip " \t\f\v" hungry-delete-except-modes '(help-mode minibuffer-mode minibuffer-inactive-mode calc-mode))) ;; Mejora C-a y C-e para ir a lo que contextualmente sería el fin de la línea (use-package mwim :bind (([remap move-beginning-of-line] . mwim-beginning) ([remap move-end-of-line] . mwim-end))) ;; Ayuda a manipular los archivos con líneas demasiado largas (use-package so-long :ensure nil :hook (after-init . global-so-long-mode) :bind (:map so-long-mode-map ("C-s" . isearch-forward) ("C-r" . isearch-backward)) :config (setq so-long-variable-overrides '((bidi-inhibit-bpa . t) (bidi-paragraph-direction . left-to-right) (buffer-read-only . nil) (global-hl-line-mode . nil) (line-move-visual . t) (show-paren-mode . nil) (truncate-lines . nil) (which-func-mode . nil)))) (provide 'init-editor) ;;; init-editor.el ends here