Skip to content

marcelocanales/emacs-configuration

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 

Repository files navigation

System Information

(defvar my-hostname (nth 0 (split-string (shell-command-to-string "hostname"))))

(defvar my-arch-p (equal my-hostname "arch"))
(defvar my-macbook-p (equal my-hostname "ELECTRA.local"))

(defun display-hostname ()
  "Display the hostname at startup."
  (message "Hi Marcelo, Welcome to Emacs! You are on host: %s" my-hostname))

(add-hook 'emacs-startup-hook 'display-hostname)

(unless (or my-arch-p my-macbook-p)
  (error "Hostname '%s' not recognized. Emacs configuration halted." my-hostname))

Interface Tweeks

;; Disable startup message
(setq inhibit-startup-message t)
;; Disable tool bar
(tool-bar-mode -1)
;; Disable menu bar
(menu-bar-mode t)
;; Disable scroll bar
(scroll-bar-mode -1)
;; Disable tooltip mode
(tooltip-mode -1)
;; Display line numbers
(global-display-line-numbers-mode t)
;; Enable line highlight
(global-hl-line-mode t)
;; Set fringe mode
(set-fringe-mode 10)
;; Visible bell
(setq visible-bell t)


(setq compilation-scroll-output t)

Font

(if my-arch-p
	  (add-to-list 'default-frame-alist '(font . "JetBrains Mono-10.8"))
  )
(if my-macbook-p
	  (add-to-list 'default-frame-alist '(font . "JetBrains Mono-12"))
  )

Themes

;; Themes
;; (use-package gruvbox-theme
;;   :ensure t)

;; (use-package cyberpunk-theme
;;   :ensure t)

;; (use-package zenburn-theme
;;   :ensure t)

;; (use-package monokai-theme
;;   :ensure t)

(use-package doom-themes
  :ensure t
  :config
  (setq doom-themes-enable-bold t) ; if nil, bold is universally disabled
  (setq doom-themes-enable-italic t) ; if nil, italics is universally disabled
  ;; (load-theme 'doom-gruvbox t)
  ;;(load-theme 'doom-badger t)
  (load-theme 'doom-tomorrow-night t)
  (doom-themes-org-config))

Environment Variables

(use-package exec-path-from-shell
  :ensure t)

(dolist (var '("JAVA_HOME" "LSP_USE_PLISTS"))
  (add-to-list 'exec-path-from-shell-variables var))

(exec-path-from-shell-initialize)


(setq auto-save-file-name-transforms
          `((".*" ,(concat user-emacs-directory "auto-save/") t))) 


;; Backups
;; Don't clutter up directories with files~
(setq backup-directory-alist `(("." . ,(expand-file-name
                                        (concat dotfiles-dir "backups")))))


(setq undo-limit 100)

Matching Delimiters

;; Electric Pair
(electric-pair-mode t)

Wrap and truncate lines

(add-hook 'text-mode-hook
                  '(lambda()
                         (setq truncate-lines nil word-wrap t)))

(add-hook 'prog-mode-hook
                  '(lambda()
                         (setq truncate-lines t word-wrap nil)))

Global Key Binding

;; Personal global and general key bindings
(global-set-key (kbd "C-z") 'undo)
(global-set-key (kbd "M-z") 'undo)  ;; Esto hará que M-z haga undo en ambos sistemas.

;; macOS Config
(when (eq system-type 'darwin)
  (setq mac-option-modifier nil)
  (setq mac-command-modifier 'meta))

Buffers

(defalias 'list-buffers 'ibuffer)

Ediff

(setq ediff-split-window-function 'split-window-horizontally)
(setq ediff-window-setup-function 'ediff-setup-windows-plain)

Ido

(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode 1)

Try

(use-package try
  :ensure t)

Org-Mode

;;    (straight-use-package '(org :type built-in)) TODO REVISAR
      ;; Org-Mode Stuff
      (use-package org-bullets
        :ensure t
        :custom (org-bullets-bullet-list
                  '("" "" "" "" "" "" "")) (org-ellipsis "")
        :config
        (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))



      (custom-set-faces
       '(org-level-1 ((t (:inherit outline-1 :height 1.0))))
       '(org-level-2 ((t (:inherit outline-2 :height 1.0))))
       '(org-level-3 ((t (:inherit outline-3 :height 1.0))))
       '(org-level-4 ((t (:inherit outline-4 :height 1.0))))
       '(org-level-5 ((t (:inherit outline-5 :height 1.0))))
       '(org-level-6 ((t (:inherit outline-5 :height 1.0))))
       '(org-level-7 ((t (:inherit outline-5 :height 1.0))))   
       '(org-document-title ((t (:inherit outline-1 :height 1.0))))
       )

      ;; Org TODO States
      (setq org-todo-keywords
                '((sequence "TODO(t)" "DOING(g)" "|"   "DONE(d)")))

      ;; Indent mode by default
    ;;(add-hook 'org-mode-hook 'org-indent-mode) - Se cambia por org-adapt-indentation (modifica el archivo adaptado a los niveles)
        (setq org-adapt-indentation t)
    ;; Permite colocar atributos para redimencionar imagenes
    (setq org-image-actual-width nil)

    ;; Inicia mostrando imagenes inline
    (setq org-startup-with-inline-images t)

    (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
    (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
    (set-face-attribute 'org-table nil  :inherit 'fixed-pitch)
    (set-face-attribute 'org-formula nil  :inherit 'fixed-pitch)
    (set-face-attribute 'org-code nil   :inherit '(shadow fixed-pitch))
  ;;TODO Revisar, al parecer esta provocando errores al inicio.
  ;;(set-face-attribute 'org-indent nil :inherit '(org-hide 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)

Org-Roam

(use-package org-roam
  :ensure t
  :after org
  :custom
  (org-roam-directory (file-truename "~/Documents/roam-notes/main"))
  (org-roam-completion-everywhere t)
  (org-roam-dailies-directory "journal/")
  (org-roam-capture-templates
   '(("d" "default" plain
      "%?"
      :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
      :unnarrowed t)
         ("l" "programming language" plain
          "* Characteristics\n\n- Family: %?\n- Inspired by: \n\n* Reference:\n\n"
          :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
          :unnarrowed t)
         ("b" "books" plain
          "\n* Información\n\nAutor: %^{Autor}\n\n%?"
          :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
          :unnarrowed t)
                 ))

  :bind (("C-c n l" . org-roam-buffer-toggle)
         ("C-c n f" . org-roam-node-find)
         ("C-c n i" . org-roam-node-insert)
         ("C-c n j j" . org-roam-dailies-goto-today)
         ("C-c n j p" . org-roam-dailies-goto-previous-note)
         ("C-c n j n" . org-roam-dailies-goto-next-note)
         ("C-c n j y" . org-roam-dailies-goto-yesterday)
         ("C-c n j t" . org-roam-dailies-goto-tomorrow)
         ("C-c n j d" . org-roam-dailies-goto-date)          
         ("C-c n j c" . org-roam-dailies-capture-today)
         ("C-c n I" . org-roam-node-insert-immediate)
         :map org-mode-map
         ("C-M-i" . completion-at-point))
  :config
  (org-roam-db-autosync-mode))

(add-to-list 'display-buffer-alist
             '("\\*org-roam\\*"
               (display-buffer-in-side-window)
               (side . right)
               (slot . 0)
               (window-width . 0.25)
               (window-parameters . ((no-other-window . t)
                                     (no-delete-other-windows . t)))))
(setq org-roam-mode-sections
          (list #'org-roam-backlinks-section
            #'org-roam-reflinks-section
            #'org-roam-unlinked-references-section
                        ))

(setq org-hide-emphasis-markers t)

(defun org-roam-node-insert-immediate (arg &rest args)
  (interactive "P")
  (let ((args (cons arg args))
                (org-roam-capture-templates (list (append (car org-roam-capture-templates)
                                                                                                  '(:immediate-finish t)))))
    (apply #'org-roam-node-insert args)))


(defun org-roam-set-directory ()
  "Set the org-roam directory by choosing from a predefined list."
  (interactive)
  (ivy-read "Choose org-roam directory: "
            '("~/Documents/roam-notes/main/"
              "~/Documents/roam-notes/bch/")
            :action (lambda (dir)
                      (setq org-roam-directory dir)
                      (org-roam-db-autosync-mode)
                      (message "Org-roam directory set to %s" dir))))


(defun my/toggle-org-hide-emphasis-markers ()
  "Toggle the visibility of emphasis markers in org-mode."
  (interactive)
  (if (eq org-hide-emphasis-markers t)
      (progn
        (setq org-hide-emphasis-markers nil)
        (message "Emphasis markers are now visible."))
    (progn
      (setq org-hide-emphasis-markers t)
      (message "Emphasis markers are now hidden.")))
  (org-mode-restart))

Org-Roam-UI

(use-package org-roam-ui
  :ensure t
  ;;  :straight
  ;;    (:host github :repo "org-roam/org-roam-ui" :branch "main" :files ("*.el" "out"))
  ;;    :after org-roam
  ;;         normally we'd recommend hooking orui after org-roam, but since org-roam does not have
  ;;         a hookable mode anymore, you're advised to pick something yourself
  ;;         if you don't care about startup time, use  
  :after org-roam  ;; Asegúrate de que org-roam se cargue primero
  :config
  (setq org-roam-ui-sync-theme t)
  (setq org-roam-ui-follow t)
  (setq org-roam-ui-update-on-save t))
	  ;;org-roam-ui-open-on-start t)
;;  :hook (org-roam-mode . org-roam-ui-mode))

Babel

(use-package ob-restclient
  :ensure t
  :after org)

(org-babel-do-load-languages
 'org-babel-load-languages
 '((restclient . t))) ;; Asegúrate de que esto esté dentro del bloque donde configuras org-mode o después de cargar org

(setq org-confirm-babel-evaluate nil)

Ace Window

(use-package ace-window
  :ensure t
  :init
  (progn
    (global-set-key [remap other-window] 'ace-window)
    (custom-set-faces
     '(aw-leading-char-face
       ((t (:inherit ace-jump-face-foreground :height 2.0)))))
    (setq aw-keys '(?j ?k ?l ?u ?i ?o ?p))
    (setq aw-ignore-current t)
    ;; Añade el advice para ejecutar golden-ratio después de ace-window
    (advice-add 'ace-window :after 'golden-ratio))
)

Which Key

(use-package which-key
  :ensure t
  :config (which-key-mode))

Super Save

(use-package super-save
  :ensure t
  :config
  (super-save-mode +1))

(setq super-save-auto-save-when-idle t)

;;Auto Save default disabled
(setq auto-save-default nil)

;; add integration with ace-window
(add-to-list 'super-save-triggers 'ace-window)

;; save on find-file
(add-to-list 'super-save-hook-triggers 'find-file-hook)

;; Turn off super-save remote files
(setq super-save-remote-files nil)

;; Super save exclude example - Sigue deshabilitado
;;(setq super-save-exclude '(".gpg"))

FZF

(use-package fzf
  :bind
    ;; Don't forget to set keybinds!
  :config
  (setq fzf/args "-x --color bw --print-query --margin=1,0 --no-hscroll"
        fzf/executable "fzf"
        fzf/git-grep-args "-i --line-number %s"
        ;; command used for `fzf-grep-*` functions
        ;; example usage for ripgrep:
        ;; fzf/grep-command "rg --no-heading -nH"
        fzf/grep-command "grep -nrH"
        ;; If nil, the fzf buffer will appear at the top of the window
        fzf/position-bottom t
        fzf/window-height 15))

Counsel

(use-package counsel
  :ensure t)

(use-package counsel-projectile
  :ensure t
  :config
  (counsel-projectile-mode 1))

(defun projectile-counsel-fzf ()
  "Use `counsel-fzf` to find files in the current project."
  (interactive)
  (let ((default-directory (projectile-project-root)))
    (counsel-fzf nil default-directory)))


(defun projectile-counsel-fzf-respecting-gitignore ()
  "Use `counsel-fzf` with `fd` to respect .gitignore when finding files in the current project."
  (interactive)
  (let ((default-directory (projectile-project-root))
        (counsel-fzf-cmd "fd . --type f --hidden --follow --exclude .git | fzf -f \"%s\" -0 -1"))
    (counsel-fzf nil default-directory)))



(defun projectile-counsel-fzf-tags ()
  "Use `counsel-fzf` to search for tags in the current project."
  (interactive)
  (let* ((default-directory (projectile-project-root))
         (tags-file (concat default-directory "tags"))
         (counsel-fzf-cmd (format "awk '{print $1}' %s | fzf -f '%%s' -0 -1" tags-file))
         (selected-tag (counsel-fzf nil default-directory)))
    (when selected-tag
      (find-tag selected-tag))))

Swipper

(use-package swiper
    :ensure try
    :bind (
           ("C-s" . swiper)
           ("C-r" . swiper)
           ("C-c C-r" . 'ivy-resume)
           ("M-x" . counsel-M-x)
           ("C-x C-f" . counsel-find-file)
          )
    :config
    (progn
      (ivy-mode)
      (setq ivy-use-virtual-buffers t)

      (setq enable-recursive-minibuffers t)
      (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
     ))

 (setq ivy-case-fold-search-default t)            ;; ignore case

Avy

(use-package avy 
 :ensure t
 :bind ("M-s" . avy-goto-char) ("C-ñ" . avy-goto-word-1))

Silversearcher

(use-package ag
  :ensure t
  :config
  (setq ag-highlight-search t))

Undo-Tree

(use-package undo-tree
  :ensure t
  :init
  (global-undo-tree-mode t))

;; Prevent undo tree files from polluting your git repo
(setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo")))

Indentation

(setq custom-tab-width 4)

(defun disable-tabs ()
	      (interactive)
  (setq indent-tabs-mode nil))

(defun enable-tabs ()
	      (interactive)
  (local-set-key (kbd "TAB") 'tab-to-tab-stop)
  (setq indent-tabs-mode t)
  (setq tab-width custom-tab-width))

;; Hooks to Enable Tabs
(add-hook 'prog-mode-hook 'enable-tabs)
;; Hook to Disable Tabs
(add-hook 'lisp-mode-hook 'disable-tabs)
(add-hook 'java-mode-hook 'disable-tabs)

Company

(use-package company
  :ensure t
  :config
  (setq company-transformers '(company-sort-by-occurrence))
  (setq company-lsp-cache-candidates 'auto)
  (setq company-lsp-enable-snippet t)
  (setq company-lsp-async t)
  (setq company-lsp-enable-recompletion t)
  (setq company-lsp--text-edit-autosave t)
  (setq company-dabbrev-downcase 0)
  (setq company-idle-delay 0.1)
  (setq company-minimum-prefix-length 2)
  (setq lsp-completion-provider :capf)
  (setq lsp-prefer-capf t))
; Wich One?
(global-company-mode t)
(add-hook 'after-init-hook 'global-company-mode)

(setq company-dabbrev-downcase nil)

Yasnippet

(use-package yasnippet
  :ensure t)

(use-package yasnippet-snippets
  :ensure t)

(setq yas-snippet-dirs '("~/.dotfiles/emacs/snippets/"))

(yas-global-mode 1)

Tree-sitter

   (use-package tree-sitter
     :ensure t)
   (use-package tree-sitter-langs
     :ensure t)

   (use-package tree-sitter
     :config
     (global-tree-sitter-mode)
     (add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode))

   (use-package tree-sitter-langs)


	(use-package treemacs-projectile
	:after treemacs projectile
     :defer t
   :ensure t)


   ;; Shortcut to jump to the Treemacs window
   (global-set-key (kbd "C-c t") 'treemacs-select-window)

   ;; Toggle Treemacs with uppercase 'T'
   (global-set-key (kbd "C-c T") 'treemacs)

All The Icons

(use-package all-the-icons
  :ensure t
  :if (display-graphic-p))

(use-package all-the-icons-ivy
  :ensure t
  :after all-the-icons ;; Asegura que all-the-icons se cargue primero
  :config
  (all-the-icons-ivy-setup))

(use-package all-the-icons-dired
  :ensure t
  :hook (dired-mode . all-the-icons-dired-mode))

Treemacs

(use-package treemacs
  :ensure t
  :config
  (define-key treemacs-mode-map [mouse-1] #'treemacs-single-click-expand-action))

(use-package treemacs-all-the-icons
  :ensure t)

(treemacs-load-theme "all-the-icons")
(treemacs-resize-icons 18)

Projectile

(use-package projectile
  :ensure t
  :init
  (projectile-mode +1)
  :bind (:map projectile-mode-map
              ("s-p" . projectile-command-map)
              ("C-c p" . projectile-command-map))
  :config
  (setq projectile-indexing-method 'alien)
  (setq projectile-enable-caching nil)
  ;;(setq projectile-generic-command "fd . --type f --hidden --follow --exclude .git")
  (setq projectile-generic-command "fd . --type f --hidden --follow --exclude .git")
        
  ;;(setq projectile-generic-command "fd . --type f")
  ;;(setq projectile-generic-command "find . -type f")


  (projectile-global-mode)
  ;;(setq projectile-completion-system 'ivy)
    )


(with-eval-after-load 'projectile
  (add-to-list 'projectile-project-root-files-bottom-up "pom.xml"))

Counsel Projectile

(use-package counsel-projectile
  :ensure t
  :config
  (counsel-projectile-mode))

Flycheck

(use-package flycheck
  :ensure t)

Rest Client

(use-package restclient
  :ensure t)

HTML

  (use-package web-mode
    :ensure t
    :config
    (add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
        (add-to-list 'auto-mode-alist '("\\.php$" . web-mode))
)
  (setq web-mode-enable-auto-closing t)

Json

(use-package json-mode
  :ensure t)

(use-package json-navigator
  :ensure t)

Yaml

(use-package yaml-mode
  :ensure t)

Typescript

(use-package typescript-mode
  :ensure t
  :defer t)

Python

(use-package pyvenv
  :ensure t
  :defer t
  :config
  (setq pyvenv-virtualenv-root "~/.miniconda/envs")
  (pyvenv-activate "~/.miniconda/envs/default")
  (setenv "WORKON_HOME" "~/.miniconda/envs"))

LSP

     (use-package lsp-mode
     :ensure t
     :defer t
     :init
     (setq lsp-keymap-prefix "C-c l")
     (setq lsp-completion-enable-additional-text-edit t)
     (setq lsp-use-plists t)
     :hook (
		     (conf-javaprop-mode . lsp)
	     (java-mode . lsp)
	     (c-mode . #'lsp-deferred)
	     (c++-mode . #'lsp-deferred)
	     (python-mode . #'lsp-deferred)
	     (json-mode . #'lsp-deferred)
	     (typescript-mode . #'lsp-deferred)
	     (web-mode . #'lsp-deferred)
	     (lsp-mode . lsp-enable-which-key-integration))
     :commands lsp)




	(use-package lsp-ui
	  :ensure t
	      :config
	      (setq lsp-ui-doc-position 'at-point)
	  :commands lsp-ui-mode)

     ;  (use-package lsp-treemacs TODO REVISAR
     ;    :ensure t
     ;    :defer t
     ;    :commands lsp-treemacs-errors-list
     ;        :config
     ;        (lsp-treemacs-sync-mode 1)
     ;)

	(use-package lsp-ivy
	  :ensure t
	  :init
	  :bind
	  (
	   ("C-c l g s" . 'lsp-ivy-workspace-symbol)
	   ("C-c l g S" . 'lsp-ivy-global-workspace-symbol))  
	  :commands lsp-ivy-workspace-symbol)


   (use-package lsp-java
     :ensure t
     :hook ((java-mode . lsp))
     :config
     (setq lsp-java-vmargs
	    '("-noverify"
	      "-Xmx4G"
	      "-Djvmflags=-Xmx4G -Xms4G"
	      "-XX:+UseZGC"
	      "-XX:+UseStringDeduplication"
	      "-javaagent:/opt/lombok/lombok.jar"))
     (setq lsp-idle-delay 0.3)
     (setq lsp-java-auto-build t)

     ;; Different JDK configurations depending on the machine
     (if my-arch-p
	  (setq lsp-java-configuration-runtimes
		'[
		  (:name "JavaSE-1.6"
		   :path "/opt/oracle/java/jdk1.6.0_45")
		  (:name "JavaSE-1.8"
		   :path "/opt/oracle/java/jdk1.8.0_202")
		  (:name "JavaSE-11"
		   :path "/opt/oracle/java/jdk-11.0.12")
		  (:name "JavaSE-17"
		   :path "/opt/oracle/java/jdk-17.0.1"
		   :default t)
		  ])
	(if my-macbook-p
	    (setq lsp-java-configuration-runtimes
		  '[
		    (:name "JavaSE-11"
		     :path "/opt/oracle/java/jdk-11.0.20.jdk/Contents/Home")
		    (:name "JavaSE-17"
		     :path "/opt/oracle/java/jdk-17.0.9.jdk/Contents/Home"
		     :default t)
		    ])))

     ;; lsp-java supplements
     ;;(require 'lsp-java-boot) ----> Commented out due to errors
     (add-hook 'lsp-mode-hook #'lsp-lens-mode)
     ;;(add-hook 'java-mode-hook #'lsp-java-boot-lens-mode) ----> Commented out due to errors
     )


   ;;   ;; SpringBoot Experimental Integrations STS4
   ;;   ;;Comentado por pruebas de rendimiento
   ;;   (require 'lsp-java-boot)
   ;;   ;; to enable the lenses
   ;;   (add-hook 'lsp-mode-hook #'lsp-lens-mode)

   ;;   ;; Comentado por pruebas de rendimiento
   ;;   (add-hook 'java-mode-hook #'lsp-java-boot-lens-mode)


   ;; Guarda el buffer luego de un code-action
   (defun my/lsp-save-buffer-after-code-action ()
     "Save buffer after LSP code action."
     (when (buffer-modified-p)
	(save-buffer)))

   (add-hook 'lsp-after-execute-code-action-hook #'my/lsp-save-buffer-after-code-action)

DAP

(use-package dap-mode
  :ensure t
  :defer t
  ;;:after lsp-mode
  :config
  (dap-auto-configure-mode)
  (dap-mode t)
  (dap-ui-mode t)
  (dap-tooltip-mode 1)
  (tooltip-mode 1)
  (dap-register-debug-template
   "localhost:8453"
   (list :type "java"
         :request "attach"
         :hostName "localhost"
         :port 8453
                 :projectName: "venta")
   )
)

(use-package dap-java
  :ensure nil
  :defer t)

Modeline

	;; This package requires the fonts included with all-the-icons to be installed. Run M-x all-the-icons-install-fonts to do so. Please refer to the installation guide.
	(use-package doom-modeline
	  :ensure t
	  :hook (after-init . doom-modeline-mode)
	  :config
	  (progn
		(setq doom-modeline-height 25)
		(setq doom-modeline-bar-width 6)
		(setq doom-modeline-hud nil)
		(setq doom-modeline-project-detection 'auto)
		(setq doom-modeline-lsp t)
		(setq doom-modeline-buffer-encoding t)
		(setq doom-modeline-checker-simple-format nil)
		(setq doom-modeline-minor-modes t)
		(setq doom-modeline-buffer-file-name-style 'truncate-except-project)
		(setq doom-modeline-persp-name nil) ;; Revisar que hace esto, 
		(setq doom-modeline-major-mode-icon t)
		(setq doom-modeline-enable-word-count t)
		(setq doom-modeline-vcs-max-length 100)
		))

	(use-package minions
	  :ensure t
   ;      :hook doom-modeline-mode
	  :config
	(minions-mode t))

	(custom-set-faces
	 '(mode-line ((t (:height 0.85))))
	 '(mode-line-inactive ((t (:height 0.85)))))

   (setq doom-modeline-icon t)
   (setq doom-modeline-major-mode-icon t)

Ivy-Rich

(use-package all-the-icons-ivy-rich
  :ensure t
  :after ivy-rich ;; Asegúrate de que ivy-rich se cargue primero
  :config
  (all-the-icons-ivy-rich-mode 1))

(use-package ivy-rich
  :ensure t
  :after ivy
  :config
  (ivy-rich-mode 1)
  (setcdr (assq t ivy-format-functions-alist) #'ivy-format-function-line))

Ivy Postframe

;; (use-package ivy-posframe
;;   :ensure t
;;   :config
;;   (ivy-posframe-mode))

Performance

;;(setq read-process-output-max (* 2048 2048))

;;(setq gc-cons-threshold 400000000)



;; Optimizaciones para mejorar el rendimiento de inicio y ejecución de Emacs

;; Aumenta la cantidad de datos que Emacs lee de los procesos para mejorar el rendimiento
;; especialmente útil para lsp-mode.
(setq read-process-output-max (* 8 1024 1024))

;; Aumenta el límite para la recolección de basura durante el inicio para acelerarlo
(setq gc-cons-threshold (* 400 1024 1024))

;; Restablece el límite de recolección de basura después del inicio a un valor más conservador
(defun reset-gc-cons-threshold ()
  (setq gc-cons-threshold (* 50 1024 1024)))

(add-hook 'emacs-startup-hook 'reset-gc-cons-threshold)

Emacs Dashboard

(use-package dashboard
  :ensure t
  :config
  (setq dashboard-startup-banner 'logo)
  (setq dashboard-banner-logo-title "Don't Tread on Me")
  (setq dashboard-center-content t)
  (setq dashboard-show-shortcuts nil)
  (setq dashboard-projects-backend 'projectile)
  (dashboard-setup-startup-hook))

Magit

(use-package magit
  :ensure t)

Custom functions

Scroll Control

;; Frames disabble scroll bars
(defun my/disable-scroll-bars (frame)
  (modify-frame-parameters frame
                           '((vertical-scroll-bars . nil)
                             (horizontal-scroll-bars . nil))))
(add-hook 'after-make-frame-functions 'my/disable-scroll-bars)

Auto Revert

;; Revert Dired and other buffers
(setq global-auto-revert-non-file-buffers t)

;; Revert buffers when the underlying file has changed
(global-auto-revert-mode 1)

json-parse-error workaround

Reference: emacs-lsp/lsp-mode#2681 (comment)

Error

(json-parse-error \u0000 is not allowed without JSON_ALLOW_NUL <callback> 1 113 113)

workaround

;(advice-add 'json-parse-string :around
;                        (lambda (orig string &rest rest)
;                          (apply orig (s-replace "\\u0000" "" string)
;                                         rest)))
(advice-add 'json-parse-string :around
            (lambda (orig string &rest args)
              (apply orig                                                                            
                     (replace-regexp-in-string "\\\\u0000.*?\"" "\"" string)
                     args)))

End of line and newline

(defun end-of-line-and-newline ()
  (interactive)
  (end-of-line)
  (newline))

(global-set-key (kbd "<C-return>") 'end-of-line-and-newline)

End of line and idented newline, except org-mode

(defun end-of-line-and-idented-newline ()
        (interactive)
        (end-of-line)
        (newline-and-indent))

(global-set-key (kbd "<M-return>") 'end-of-line-and-idented-newline)

;; Except Org Mode.
(defun my-org-mode-hook ()
  (local-set-key (kbd "<M-return>") 'org-meta-return))
(add-hook 'org-mode-hook 'my-org-mode-hook)

Custom key bindings for Org-mode bullet cycling

These key bindings were customized to avoid conflicts with Gnome keyboard shortcuts.

(add-hook 'org-mode-hook
                  (lambda ()
            (local-set-key (kbd "C-c b") 'org-cycle-list-bullet)))

Save Clipboard Image

(defcustom save-clipboard-image-directory "media"
  "Directorio para guardar las imágenes del portapapeles."
  :type 'string
  :group 'save-clipboard-image)

(defcustom save-clipboard-image-confirm-save nil
  "Si está habilitado, pide confirmación antes de guardar la imagen."
  :type 'boolean
  :group 'save-clipboard-image)

(defcustom save-clipboard-image-auto-create-directory t
  "Si está habilitado, crea automáticamente el directorio si no existe."
  :type 'boolean
  :group 'save-clipboard-image)


(defcustom save-clipboard-image-prompt-filename nil
  "Si está habilitado, pide el nombre del archivo antes de guardar la imagen."
  :type 'boolean
  :group 'save-clipboard-image)

(defun save-clipboard-image ()
  "Guarda el contenido del portapapeles como una imagen en formato `png` en el directorio configurado y devuelve el nombre del archivo de la imagen."
  (interactive)
  (let* ((exit-status (with-temp-buffer
                        (call-process "xclip" nil t nil "-selection" "clipboard" "-t" "image/png" "-o"))))
    (if (eq exit-status 0)
        (if (or (not save-clipboard-image-confirm-save)
                (y-or-n-p "¿Deseas guardar la imagen en el portapapeles?"))
            (let* ((dir-name save-clipboard-image-directory)
                   (default-filename (concat (format-time-string "%Y%m%d_%H%M%S") ".png"))
                   (filename (if save-clipboard-image-prompt-filename
                                 (read-file-name "Guardar imagen como: " dir-name nil nil default-filename)
                               (concat dir-name "/" default-filename)))
                   (full-dir-name (expand-file-name dir-name))
                   (full-filename (expand-file-name filename)))
              (unless (file-directory-p full-dir-name)
                (if save-clipboard-image-auto-create-directory
                    (make-directory full-dir-name)
                  (when (y-or-n-p (format "El directorio '%s' no existe. ¿Deseas crearlo?" dir-name))
                    (make-directory full-dir-name))))
              (with-temp-file full-filename
                (insert (with-temp-buffer
                          (call-process "xclip" nil t nil "-selection" "clipboard" "-t" "image/png" "-o")
                          (buffer-string))))
              (message "Imagen guardada como '%s'" full-filename)
              full-filename)
          (progn
            (message "Guardado de imagen cancelado.")
            nil))
      (progn
        (message "No se encontró una imagen en el portapapeles. Por favor, copia una imagen al portapapeles e intenta nuevamente.")
        nil))))

Insert image link

 (defcustom org-insert-image-display-inline t
   "Si está habilitado, muestra la imagen en línea inmediatamente después de insertar el enlace."
   :type 'boolean
   :group 'org-insert-image)


 (defvar org-insert-image-max-width 400
   "Ancho máximo para imágenes incrustadas en Org mode.")

 (defun org-insert-image ()
   "Pega un enlace al archivo de imagen guardado en el directorio configurado y muestra la imagen en línea si está habilitado."
   (interactive)
   (let ((image-file-name (save-clipboard-image)))
     (when image-file-name
       (let* ((relative-path (file-relative-name image-file-name
                                                 (file-name-directory (buffer-file-name))))
              (image-size (image-size (create-image image-file-name) :pixels))
              (image-width (car image-size))
              (scaled-width (min org-insert-image-max-width image-width)))
         (if (= image-width scaled-width)
             (insert (format "[[file:%s]]" relative-path))
           (insert (format "#+ATTR_HTML: :width %dpx\n[[file:%s]]" scaled-width relative-path)))
         (when org-insert-image-display-inline
           (org-display-inline-images))))))

 (with-eval-after-load 'org
   (define-key org-mode-map (kbd "C-c i") 'org-insert-image))



 (defun org-yank-image-or-text ()
   "Pega una imagen del portapapeles en Org mode si hay una, de lo contrario pega texto."
   (interactive)
   (let* ((exit-status (with-temp-buffer
                         (call-process "xclip" nil t nil "-selection" "clipboard" "-t" "image/png" "-o"))))
     (if (eq exit-status 0)
         (org-insert-image)
       (call-interactively 'org-yank))))

; Se comenta ya que al parecer está arrojando problemas.
; (with-eval-after-load 'org
;   (define-key org-mode-map (kbd "C-y") 'org-yank-image-or-text))

Adaptative Wrap

(use-package adaptive-wrap
  :ensure t  ; Asegúrate de que el paquete sea instalado automáticamente
  :config
  (add-hook 'visual-line-mode-hook 'adaptive-wrap-prefix-mode)
  (add-hook 'org-mode-hook 'adaptive-wrap-prefix-mode))

Golden Ratio

(use-package golden-ratio
  :ensure t
  :config
  (golden-ratio-mode 1))

About

My Emacs Configuration

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published