Skip to content

Latest commit

 

History

History
executable file
·
1186 lines (1046 loc) · 36.3 KB

emacsConf.org

File metadata and controls

executable file
·
1186 lines (1046 loc) · 36.3 KB

Emacs config

Start up

;; -*- lexical-binding: t; -*-

Garbage collection

;; Minimize garbage collection during startup
(setq gc-cons-threshold most-positive-fixnum)

;; Lower threshold to speed up garbage collection
(add-hook 'emacs-statup-hook
          (lambda()
            (setq gc-cons-threshold (* 5 1000 1000))))

Package management

Package list

;;;PACKAGE LIST
(setq package-archives
      '(("melpa" . "https://melpa.org/packages/")
        ("org" . "https://orgmode.org/elpa/")
        ("elpa" . "https://elpa.gnu.org/packages/")))

Bootstrap use-package

;;; BOOTSTRAP USE-PACKAGES
(package-initialize)
(require 'use-package-ensure)
(setq use-package-always-ensure t)
(unless (package-installed-p 'use-package)
    (package-refresh-contents)
    (package-install 'use-package))
(eval-when-compile (require 'use-package))

Package update

;;; PACKAGE UPDATE
(use-package auto-package-update
  :custom
  (auto-package-update-interval 7)
  (auto-package-update-prompt-before-update t)
  (auto-package-update-hide-results t)
  :config
  (auto-package-update-maybe)
  (auto-package-update-at-time "09:00"))

Language spelling and typing

;;; LANGUAGE SPELLING AND TYPING
(set-input-method 'spanish-prefix)
(use-package guess-language  ;Automatically detect language for Flyspell
  :ensure t
  :defer t
  :init (add-hook 'text-mode-hook #'guess-language-mode)
  :config
  (setq guess-language-langcodes '((en . ("en_US" "English" "🇺🇸" "American"))
                                   (pt . ("pt_PT" "Portuguese" "🇵🇹" "Portuguese"))
                                   (es . ("es_ES" "Spanish" "🇪🇸" "Spanish")))
        guess-language-languages '(en es pt)
        guess-language-min-paragraph-length 45)
  :diminish guess-language-mode)

(use-package go-translate
  :ensure t
  :config
  (setq gt-langs '(es en))
  (setq gt-default-translator (gt-translator :engines (gt-google-engine))))

Keybinds

;;; KEYBINDS
(use-package general
  :after evil
  :config
  (general-create-definer efs/leader-keys
    :keymaps '(normal insert visual emacs)
    :prefix "SPC"
    :global-prefix "M-SPC")
  (efs/leader-keys
    "C-s" '((lambda() (interactive)(set-input-method "spanish-prefix")) :which-key "change input method to spanish")
    "C-p" '((lambda() (interactive)(set-input-method "portuguese-prefix")) :which-key "change input method to portuguese")
    "C-j" '((lambda() (interactive)(set-input-method "japanese")) :which-key "change input method to japanese")
    "n" '(org-roam-node-find :which-key "org file with tasks")
    "t" '(vterm :which-key "teminal")
    "a" '((lambda() (interactive)(org-agenda nil "n")) :which-key "org week agenda with todos")
    "c" '(cfw:open-org-calendar :which-key "calendar")
    "d" '(treemacs :which-key "treemacs")
    "f" '(find-file :which-key "find file")
    "s" '(counsel-projectile-rg :which-key "search in project")
    "e" '(flycheck-list-errors :which-key "list of errors in code")
    "b" '(switch-to-buffer :which-key "buffer menu")
    "k" '(kill-buffer :which-key "kill buffer")
    "C-k" '(kill-buffer-and-window :which-key "kill buffer and window")
    ))

UI

basic UI setup

;;; UI
(setq inhibit-startup-message t)

(scroll-bar-mode -1)        ; Disable visible scrollbar
(tool-bar-mode -1)          ; Disable the toolbar
(tooltip-mode -1)           ; Disable tooltips
(set-fringe-mode 10)        ; Give some breathing room
(menu-bar-mode -1)          ; Disable the menu bar

;; Set up the visible bell
(setq visible-bell t)

(column-number-mode)
(setq display-line-numbers-type 'relative)
(global-display-line-numbers-mode t)

;; Split to the side by default
(setq split-width-threshold 0)
(setq split-height-threshold nil)

;; padding
;; (use-package spacious-padding
;;   :config (spacious-padding-mode 1))
;; (defun bs-sp-workaround ()
;;   "Workaround issues with `spacious-padding-mode' when using emacsclient."
;;   (when server-mode
;;     (spacious-padding-mode 1)
;;     (remove-hook 'server-after-make-frame-hook #'bs-sp-workaround)))
;; (add-hook 'server-after-make-frame-hook #'bs-sp-workaround)

;; Disable line numbers for some modes
(dolist (mode '(org-mode-hook cfw:calendar-mode-hook
                shell-mode-hook
                treemacs-mode-hook
                term-mode-hook
                vterm-mode-hook
                eshell-mode-hook))
    (add-hook mode (lambda () (display-line-numbers-mode 0))))

;;modeline
(use-package all-the-icons
  :ensure t)
(use-package doom-modeline
  :ensure t
  :init (doom-modeline-mode 1)
  :custom ((doom-modeline-height 28)))

Theme

;;; THEME
;; Customizations prior to loading the themes
(use-package modus-themes)
(setq modus-themes-italic-constructs t
      modus-themes-bold-constructs t
      modus-themes-mixed-fonts t
      modus-themes-variable-pitch-ui t
      modus-themes-org-blocks 'gray-background)

(require 'modus-vivendi-tinted-theme)
(setq modus-vivendi-tinted-palette-overrides
      '(
      (bg-main          "#0f0f0f")
      (bg-dim           "#191919")
      (fg-main          "#ffffff")
      (fg-dim           "#b9b9b9")
      (fg-alt           "#e0e0e0")
      (bg-active        "#4b4b4b")
      (bg-inactive      "#2d2d2d")
      (border           "#2d2d2d")

      (gray            "#191919")
      (gray-faint      "#2d2d2d")
      (gray-light      "#4b4b4b")
      (whiteish        "#e0e0e0")
      (light-gray      "#b9b9b9")

      ;; (red             "#d1143d")
      ;; (red-faint       "#d1536e")
      ;; (red-intense     red)
      ;; (red-warmer      red)
      ;; (red-cooler      red-faint)

      ;; (green           "#14cc4b")
      ;; (green-faint     "#57B272")
      ;; (green-intense   green)
      ;; (green-warmer    green)
      ;; (green-cooler    green-faint)

      ;; (yellow          "#DFAD16")
      ;; (yellow-faint    "#DDC16E")
      ;; (yellow-intense  "#efef00")
      ;; (yellow-warmer   orange)
      ;; (yellow-cooler   yellow-faint)

      ;; (blue            "#1861f4")
      ;; (blue-faint      "#7aa3f4")
      ;; (blue-intense    blue)
      ;; (blue-warmer     blue)
      ;; (blue-cooler     blue-faint)

      ;; (magenta         "#ea2eb8")
      ;; (magenta-faint   "#ea75cb")
      ;; (magenta-intense magenta)
      ;; (magenta-warmer  magenta-faint)
      ;; (magenta-cooler  purple-faint)

      ;; (cyan            "#14B1CC")
      ;; (cyan-faint      "#51BACD")
      ;; (cyan-intense    cyan)
      ;; (cyan-warmer     cyan)
      ;; (cyan-cooler     cyan-faint)

      ;; (purple          "#732EEA")
      ;; (purple-faint    "#9F71EA")
      ;; (orange          "#E56115")
      ;; (orange-faint    "#E68E5C")

      ;; ;;backgrounds
      ;; (bg-red-intense      "#990F2D")
      ;; (bg-green-intense    "#0F9939")
      ;; (bg-blue-intense     "#0F3D99")
      ;; (bg-yellow-intense   "#99770F")
      ;; (bg-magenta-intense  "#991E79")
      ;; (bg-cyan-intense     "#0F8499")
      ;; (bg-purple-intense   "#4811A7")
      ;; (bg-orange-intense   "#99420F")

      ;; (bg-red-subtle       "#660A1E")
      ;; (bg-green-subtle     "#0A6624")
      ;; (bg-blue-subtle      "#0A2966")
      ;; (bg-yellow-subtle    "#664F0A")
      ;; (bg-magenta-subtle   "#661450")
      ;; (bg-cyan-subtle      "#0A5866")
      ;; (bg-purple-subtle    "#300B6F")
      ;; (bg-orange-subtle    "#662C0A")

      ;; (bg-red-nuanced      "#33050F")
      ;; (bg-green-nuanced    "#053312")
      ;; (bg-blue-nuanced     "#051433")
      ;; (bg-yellow-nuanced   "#332705")
      ;; (bg-magenta-nuanced  "#330A28")
      ;; (bg-cyan-nuanced     "#052C33")
      ;; (bg-purple-nuanced   "#180638")
      ;; (bg-orange-nuanced   "#331505")

      (bg-completion       bg-blue-subtle)
      (bg-hover            bg-cyan-sublte)
      (bg-hover-secondary  bg-orange-subtle)
      (bg-hl-line          bg-purple-subtle)
      (bg-region           gray-light)
      (fg-region           witheish)

      (bg-char-0 bg-blue-subtle)
      (bg-char-1 bg-magenta-subtle)
      (bg-char-2 bg-yellow-subtle)

      (bg-mode-line-active        gray)
      (fg-mode-line-active        whiteish)
      (border-mode-line-active    unespecified)
      (bg-mode-line-inactive      gray-faint)
      (fg-mode-line-inactive      light-gray)
      (border-mode-line-inactive  unespecified)

      (modeline-err     red-faint)
      (modeline-warning yellow-faint)
      (modeline-info    cyan-faint)

      (bg-tab-bar      gray-faint)
      (bg-tab-current  bg-main)
      (bg-tab-other    gray-light)

      ;;mapping
      (fringe bg-dim)
      (cursor yellow-faint)

      (keybind blue-faint)
      (name magenta-faint)
      (identifier yellow-faint)

      (err red)
      (warning yellow)
      (info cyan)

      (underline-err red)
      (underline-warning yellow)
      (underline-note cyan)

      ;;headings
      (fg-heading-0 whiteish)
      (fg-heading-1 cyan-faint)
      (fg-heading-2 yellow-faint)
      (fg-heading-3 blue-faint)
      (fg-heading-4 magenta-faint)
      (fg-heading-5 green-faint)
      (fg-heading-8 purple-faint)
      (fg-heading-7 orange-faint)
      (fg-heading-6 red-faint)

      ;;code
      (builtin purple)
      (comment green-faint)
      (constant blue-faint)
      (docstring cyan-faint)
      (docmarkup orange-faint)
      (fnname purple-faint)
      (keyword magenta-faint)
      (preprocessor red-faint)
      (string green)
      (type cyan-faint)
      (variable cyan)
      (rx-construct green-cooler)
      (rx-backslash orange)
       ))

(load-theme 'modus-vivendi-tinted :no-confirm)

Background and terminal opacity

 ;;  (defun set-black-background()
 ;;    "Make theme's background color black."
 ;;    (set-face-background 'default "#000000" (selected-frame)))

 ;;  (if (daemonp)
 ;;    (add-hook 'after-make-frame-functions
 ;;              (lambda (frame)
 ;;                ;; (setq doom-modeline-icon t)
 ;;                (with-selected-frame frame
 ;;                  (set-black-background))))
 ;;    (set-black-background))

;; Transparent background on GUI
;; (set-frame-parameter nil 'alpha-background 80)
;; (add-to-list 'default-frame-alist '(alpha-background . 80))
 
(defun on-frame-open (&optional frame)
  "If the FRAME is created in a terminal don't load background color."
  (unless (display-graphic-p frame)
    (set-face-background 'default "unspecified-bg" frame)))

(add-hook 'after-make-frame-functions 'on-frame-open)

(defun on-after-init ()
  "If the selected FRAME is in a terminal don't load background color."
  (unless (display-graphic-p (selected-frame))
    (set-face-background 'default "unspecified-bg" (selected-frame))))

(add-hook 'window-setup-hook 'on-after-init)

Font

;;; FONT
(defvar efs/default-font-size 110)
(defvar efs/default-variable-font-size 110)

(set-face-attribute 'default nil :font "SauceCodePro Nerd Font" :height efs/default-font-size)
;; Set the fixed pitch face
(set-face-attribute 'fixed-pitch nil :font "SauceCodePro Nerd Font" :height efs/default-font-size)
;; Set the variable pitch face
(set-face-attribute 'variable-pitch nil :font "DejaVu Sans" :height efs/default-variable-font-size :weight 'regular)

Add support for 256colors on ST

(add-to-list 'term-file-aliases
    '("st-256color" . "xterm-256color"))

Org-mode

Font

(defun efs/org-font-setup ()
  "Set faces for `org-mode' heading levels."
  (dolist (face '((org-level-1 . 1.2)
                  (org-level-2 . 1.1)
                  (org-level-3 . 1.05)
                  (org-level-4 . 1.0)
                  (org-level-5 . 1.0)
                  (org-level-6 . 1.0)
                  (org-level-7 . 1.0)
                  (org-level-8 . 1.0)))
    (set-face-attribute (car face) nil :font "SauceCodePro Nerd Font" :weight 'regular :height (cdr face)))

  ;; Ensure that anything that should be fixed-pitch in Org files appears that way
  (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))
  (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 'line-number nil :inherit 'fixed-pitch)
  (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch))

Basic setup

;;; ORG-MODE
(require 'org)
(defun efs/org-mode-setup ()
  "Set up `org-mode'."
  (org-indent-mode)
  (variable-pitch-mode 1)
  (visual-line-mode 1))

(use-package org
  :pin org
  :commands (org-capture org-agenda)
  :hook (org-mode . efs/org-mode-setup)
  :config
  (setq org-ellipsis "")

  (setq org-todo-keywords
    '((sequence "TODO(t)" "PROG(p)" "DONE(d)")))

  (setq org-agenda-custom-commands
    '(("n" "Custom Agenda with TODOs"
       ((agenda "")
        (todo "PROG")
        (todo "TODO")
       ))))

  (setq org-return-follows-link t)

  (setq org-agenda-span 10)
  (setq org-agenda-start-with-log-mode t)
  (setq org-log-done 'time)
  (setq org-log-into-drawer t)

  (setq org-refile-targets
    '(("~/notes/20240707172055-archive.org" :maxlevel . 1)))
  (advice-add 'org-refile :after 'org-save-all-org-buffers)

  (efs/org-font-setup))

(use-package evil-org
  :ensure t
  :after (evil org)
  :hook (org-mode . (lambda () evil-org-mode))
  :config
  (require 'evil-org-agenda)
  (evil-org-agenda-set-keys))

org-roam

;;org-roam
(use-package org-roam
  :ensure t
  :custom
  (org-roam-directory (file-truename "~/notes"))
  (org-roam-completion-everywhere t)
  (org-roam-capture-templates
   '(("d" "default" plain
      "\n- tags :: %?"
      :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 g" . org-roam-ui-open)
         ("C-c n c" . org-roam-capture))
  :bind-keymap ("C-c j" . org-roam-dailies-map)
  :config
  (add-to-list 'display-buffer-alist
               '("\\*org-roam\\*"
                 (display-buffer-in-direction)
                 (direction . right)
                 (window-width . 0.33)
                 (window-height . fit-window-to-buffer)))
  (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) (org-roam-db-autosync-mode)
  (require 'org-roam-dailies)
  (setq org-roam-dailies-directory "journal/")
  (setq org-roam-dailies-capture-templates
        '(("d" "default" entry "%?"
           :target (file+head "%<%Y-%m-%d>.org"
                              "#+title: %<%Y-%m-%d>\n#+filetags: journal\n \n- tags :: [[id:756fbf4c-a9b6-4a52-b512-bd39842029a1][journal]] \n "))))
  (require 'org-roam-export)
  (require 'org-roam-protocol))
(use-package org-roam-ui
  :ensure t
  :after org-roam)

(require 'org-roam)
(defun my/org-roam-filter-by-tag (tag-name)
  (lambda (node)
    (member tag-name (org-roam-node-tags node))))

(defun my/org-roam-list-notes-by-tag (tag-name)
  (mapcar #'org-roam-node-file
          (seq-filter
           (my/org-roam-filter-by-tag tag-name)
           (org-roam-node-list))))

(defun my/org-roam-refresh-agenda-list ()
  (interactive)
  (setq org-agenda-files (my/org-roam-list-notes-by-tag "tasks")))

;; Build the agenda list the first time for the session
(my/org-roam-refresh-agenda-list)

(defun my/org-roam-project-finalize-hook ()
  "Adds the captured project file to `org-agenda-files' if the
capture was not aborted."
  ;; Remove the hook since it was added temporarily
  (remove-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook)

  ;; Add project file to the agenda list if the capture was confirmed
  (unless org-note-abort
    (with-current-buffer (org-capture-get :buffer)
      (add-to-list 'org-agenda-files (buffer-file-name)))))

(defun my/org-roam-find-project ()
  (interactive)
  ;; Add the project file to the agenda after capture is finished
  (add-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook)

  ;; Select a project file to open, creating it if necessary
  (org-roam-node-find
   nil
   nil
   (my/org-roam-filter-by-tag "tasks")))

(global-set-key (kbd "C-c n t") #'my/org-roam-find-project)

Look setup

(use-package visual-fill-column)
(defun efs/org-mode-visual-fill ()
  "Center text on `org-mode'."
  (setq visual-fill-column-width 120
        visual-fill-column-center-text t)
  (visual-fill-column-mode 1))

(use-package org-bullets
  :hook (org-mode . org-bullets-mode)
  :custom
  (org-bullets-bullet-list '("" "" "" "" "" "" "")))

(use-package visual-fill-column
  :hook (org-mode . efs/org-mode-visual-fill))

code blocks

;; source block
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("calc" . "src calc"))
(add-to-list 'org-structure-template-alist '("py" . "src python"))
(add-to-list 'org-structure-template-alist '("oc" . "src ocaml"))
(add-to-list 'org-structure-template-alist '("cpp" . "src cpp"))
(add-to-list 'org-structure-template-alist '("js" . "src javascript"))
(add-to-list 'org-structure-template-alist '("xml" . "src xml"))

;; Org babel for code blocks
(with-eval-after-load 'org
  (org-babel-do-load-languages
      'org-babel-load-languages
      '((emacs-lisp . t)
      (shell . t)
      (calc . t)
      (ocaml . t)
      (python . t)))

(push '("conf-unix" . conf-unix) org-src-lang-modes))

latex export

;;colors in latex export
(require 'ox-latex)
(add-to-list 'org-latex-packages-alist '("" "minted"))
(setq org-latex-src-block-backend 'minted)

(setq org-latex-pdf-process
      '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
        "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
        "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))

Evilmode vim keys

;;; VIM
(use-package evil
  :demand t
  :bind (("<escape>" . keyboard-escape-quit))
  :init
  ;; allow for using cgn
  ;; (setq evil-search-module 'evil-search)
  (setq evil-want-keybinding nil)
  ;; no vim insert bindings
  (setq evil-undo-system 'undo-fu)
  :config
  (evil-mode t)
  (define-key evil-insert-state-map (kbd "C-g") 'evil-normal-state)
  (define-key evil-normal-state-map "\C-w\C-h" 'evil-window-left)
  (define-key evil-normal-state-map "\C-w\C-j" 'evil-window-down)
  (define-key evil-normal-state-map "\C-w\C-k" 'evil-window-up)
  (define-key evil-normal-state-map "\C-w\C-l" 'evil-window-right)
  (define-key evil-motion-state-map (kbd "SPC") nil)
  (define-key evil-motion-state-map (kbd "RET") nil)
  (evil-set-initial-state 'messages-buffer-mode 'normal)
  (evil-set-initial-state 'dashboard-mode 'normal))

(use-package evil-collection
  :after evil
  :config
  (setq evil-want-integration t)
  (evil-collection-init))

;; Change cursor terminal
(unless (display-graphic-p)
  (use-package evil-terminal-cursor-changer
  :config (evil-terminal-cursor-changer-activate)))

Code completion and correction

;;; Code Completion and correction

lsp

;;lsp
(use-package lsp-mode
  :commands (lsp lsp-deferred)
  :hook (lsp-mode . efs/lsp-mode-setup)
  :bind
  (:map lsp-mode-map
        (("M-RET" . lsp-execute-code-action)))
  :config
  (lsp-enable-which-key-integration t))
  (add-hook 'dockerfile-mode-hook #'lsp)
  (add-hook 'java-mode-hook #'lsp)
  (add-hook 'python-mode-hook #'lsp)
  (add-hook 'sql-mode-hook #'lsp)
  (add-hook 'c-mode-hook #'lsp)
  (add-hook 'c++-mode-hook #'lsp)
  (add-hook 'cmake-mode-hook #'lsp)
  (add-hook 'bash-mode-hook #'lsp)
  (add-hook 'web-mode-hook #'lsp)
  (add-hook 'dart-mode-hook #'lsp)
  (add-hook 'ocaml-mode-hook #'lsp)

(defun efs/lsp-mode-setup ()
  "Set up lsp mode."
  (setq lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols))
  (lsp-headerline-breadcrumb-mode))

(use-package lsp-ui
  :hook (lsp-mode . lsp-ui-mode)
  :custom
  (lsp-ui-doc-position 'bottom))

(use-package lsp-treemacs
  :after (lsp treemacs))

flychek

;;flycheck
(use-package flycheck
  :ensure t
  :init (global-flycheck-mode))

company

;;company
(use-package company
  :after lsp-mode
  :hook (lsp-mode . company-mode)
  :bind (:map company-active-map
          ("<tab>" . company-complete-selection))
        (:map lsp-mode-map
          ("<tab>" . company-indent-or-complete-common))
  :custom
  (company-minimum-prefix-length 1)
  (company-idle-delay 0.0))
(use-package company-box
  :hook (company-mode . company-box-mode))

snippets

;;yasnippet
(use-package yasnippet
  :config (yas-global-mode))
(use-package yasnippet-snippets)

;; fix yasnippet conflicts
(require 'company)
(defun company-yasnippet-or-completion ()
  "Use Yasnippet or fall back to company completion."
  (interactive)
  (unless (yas-maybe-expand-abbrev-key-filter 'yas-triggers-in-field)
    (call-interactively #'company-complete-common)))

(add-hook 'company-mode-hook
          (lambda ()
            (substitute-key-definition 'company-complete-common
                                       'company-yasnippet-or-completion
                                        company-active-map)))

Language setup

;;; Language specific configurations 

Ocaml

;;Ocaml
(require 'opam-user-setup "~/.emacs.d/opam-user-setup.el")
(use-package flycheck-ocaml
  :config
  (with-eval-after-load 'merlin
    ;; Disable Merlin's own error checking
    (setq merlin-error-after-save nil)
    ;; Enable Flycheck checker
    (flycheck-ocaml-setup))
  (add-hook 'tuareg-mode-hook #'merlin-mode))

C/C++

;;C/C++
(setq-default fill-column 80)
(add-hook 'c-mode-hook 'display-fill-column-indicator-mode)
(add-hook 'c++-mode-hook 'display-fill-column-indicator-mode)

Java

;;Java
(use-package lsp-java
  :config (add-hook 'java-mode-hook 'lsp))
(require 'lsp-java-boot)
;; to enable the lenses
(add-hook 'lsp-mode-hook #'lsp-lens-mode)
(add-hook 'java-mode-hook #'lsp-java-boot-lens-mode)

Python

;;Python
(use-package python-mode
  :ensure t
  :hook (python-mode . lsp-deferred)
  :custom
  ;; NOTE: Set these if Python 3 is called "python3" on your system!
  ;; (python-shell-interpreter "python3")
  ;; (dap-python-executable "python3")
  (dap-python-debugger 'debugpy)
  :config
  (require 'dap-python))
(use-package pyvenv
  :after python-mode
  :config
  (pyvenv-mode 1))

Erlang

;;Erlang
;;(setq load-path (cons "/lib/erlang/lib/tools-3.5.2/emacs"
;;load-path))
;;(setq erlang-root-dir "/lib/erlang")
;;(setq exec-path (cons "/lib/erlang/bin" exec-path))
;;(require 'erlang-start)
;;(require 'erlang-flymake)

Web dev

;;html-js
(use-package web-mode
  :mode
  (".twig$"
   ".html?$"
   ".hbs$"
   ".vue$"
   ".blade.php$")
  :config
  (setq web-mode-markup-indent-offset 2
        web-mode-css-indent-offset 2
        web-mode-code-indent-offset 2
        web-mode-style-padding 2
        web-mode-script-padding 2
        web-mode-enable-auto-closing t
        web-mode-enable-auto-opening t
        web-mode-enable-auto-pairing t
        web-mode-enable-auto-indentation t))

Flutter

;;Flutter
(use-package dart-mode)

(use-package lsp-dart
  :after dart-mode
  :config (setq lsp-dart-dap-flutter-hot-reload-on-save  t))

(setq gc-cons-threshold (* 100 1024 1024)
      read-process-output-max (* 1024 1024))

Nix

;;Nix
(use-package nix-mode)

Meson

;;Meson
(use-package meson-mode)

Dired

;;;DIRED
(use-package pdf-tools)
(use-package dired-single :defer t)
(use-package dired-ranger :defer t)
(use-package dirvish
  :init
  (dirvish-override-dired-mode)
  :custom
  (dirvish-quick-access-entries ; It's a custom option, `setq' won't work
   '(("h" "~/"                          "Home")
     ("d" "~/downloads/"                "Downloads")
     ("u" "/universidad/"               "Universidad")
     ("i" "/igalia/"                    "Igalia")
     ("t" "~/.local/share/Trash/files/" "TrashCan")))
  :config
  ;; (dirvish-peek-mode) ; Preview files in minibuffer
  ;; (dirvish-side-follow-mode) ; similar to `treemacs-follow-mode'
  (evil-make-overriding-map dirvish-mode-map 'normal)
  (setq dirvish-reuse-session t)
  (setq dired-mouse-drag-files t)
  (setq mouse-drag-and-drop-region-cross-program t)
  (setq dirvish-mode-line-format
        '(:left (sort symlink) :right (omit yank index)))
  (setq dirvish-attributes
        '(all-the-icons file-size collapse subtree-state))
  (setq delete-by-moving-to-trash t)
  (setq dired-listing-switches
        "-l --almost-all --human-readable --group-directories-first --no-group")
  (setq dirvish-open-with-programs 
    (append dirvish-open-with-programs '(
      (("xlsx" "docx" "doc" "odt" "ods") "libreoffice" "%f")
      (("jpg" "jpeg" "png")              "eog" "%f")
      (("pdf")                           "zathura" "%f"))))
  :bind ; Bind `dirvish|dirvish-side|dirvish-dwim' as you see fit
  (("C-c f" . dirvish-fd)
   :map dirvish-mode-map ; Dirvish inherits `dired-mode-map'
   ("h"   . dired-single-up-directory)
   ("j"   . dired-next-line)
   ("k"   . dired-previous-line)
   ("l"   . dired-single-buffer)
   ("q"   . dirvish-quit)
   ("f"   . dirvish-file-info-menu)
   ("y"   . dirvish-yank-menu)
   ("N"   . dirvish-narrow)
   ("y"   . dired-ranger-copy)
   ("X"   . dired-ranger-move)
   ("p"   . dired-ranger-paste)
   ("TAB" . dirvish-subtree-toggle)
   ("C-a" . dirvish-quick-access)
   ("C-f" . dirvish-fd-jump)
   ("C-c t" . dirvish-layout-toggle)
   ("C-c d" . make-directory)
   ("C-c m" . dirvish-mark-menu)
   ("M-c e" . dirvish-emerge-menu)))

Other packages

;;; Other packages

Ivy

;;ivy
(use-package ivy
  :config
  (ivy-mode t)
  (setq ivy-use-virtual-buffers t)
  (setq enable-recursive-minibuffers t))

(use-package ivy-rich
  :after ivy
  :init (ivy-rich-mode t))

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

(use-package ivy-prescient
  :after counsel
  :custom
  (ivy-prescient-enable-filtering nil)
  :config
  (prescient-persist-mode t)
  (ivy-prescient-mode t))

(use-package lsp-ivy
  :after lsp)

Projectile

;;projectile
(use-package projectile
  :diminish projectile-mode
  :config (projectile-mode)
  :custom ((projectile-completion-system 'ivy))
  :bind-keymap
  ("C-c p" . projectile-command-map)
  :init
  ;; NOTE: Set this to the folder where you keep your Git repos!
  ;; (when (file-directory-p "~/")
  ;; (setq projectile-project-search-path '("~/")))
  (setq projectile-switch-project-action #'projectile-dired))

(use-package counsel-projectile
  :after projectile
  :config (counsel-projectile-mode))

Treemacs

;;treemacs
(use-package treemacs
  :ensure t
  :defer t
  :config
  (progn
    (setq treemacs-collapse-dirs                   (if treemacs-python-executable 3 0)
          treemacs-deferred-git-apply-delay        0.5
          treemacs-directory-name-transformer      #'identity
          treemacs-display-in-side-window          t
          treemacs-eldoc-display                   'simple
          treemacs-file-event-delay                2000
          treemacs-file-extension-regex            treemacs-last-period-regex-value
          treemacs-file-follow-delay               0.2
          treemacs-file-name-transformer           #'identity
          treemacs-follow-after-init               t
          treemacs-expand-after-init               t
          treemacs-find-workspace-method           'find-for-file-or-pick-first
          treemacs-git-command-pipe                ""
          treemacs-goto-tag-strategy               'refetch-index
          treemacs-header-scroll-indicators        '(nil . "^^^^^^")
          treemacs-hide-dot-git-directory          t
          treemacs-indentation                     2
          treemacs-indentation-string              " "
          treemacs-is-never-other-window           nil
          treemacs-max-git-entries                 5000
          treemacs-missing-project-action          'ask
          treemacs-move-forward-on-expand          nil
          treemacs-no-png-images                   nil
          treemacs-no-delete-other-windows         t
          treemacs-project-follow-cleanup          t
          treemacs-persist-file                    (expand-file-name ".cache/treemacs-persist" user-emacs-directory)
          treemacs-position                        'left
          treemacs-read-string-input               'from-child-frame
          treemacs-recenter-distance               0.1
          treemacs-recenter-after-file-follow      nil
          treemacs-recenter-after-tag-follow       nil
          treemacs-recenter-after-project-jump     'always
          treemacs-recenter-after-project-expand   'on-distance
          treemacs-litter-directories              '("/node_modules" "/.venv" "/.cask")
          treemacs-project-follow-into-home        nil
          treemacs-show-cursor                     nil
          treemacs-show-hidden-files               t
          treemacs-silent-filewatch                nil
          treemacs-silent-refresh                  nil
          treemacs-sorting                         'alphabetic-asc
          treemacs-select-when-already-in-treemacs 'move-back
          treemacs-space-between-root-nodes        t
          treemacs-tag-follow-cleanup              t
          treemacs-tag-follow-delay                0.5
          treemacs-text-scale                      nil
          treemacs-user-mode-line-format           nil
          treemacs-user-header-line-format         nil
          treemacs-wide-toggle-width               70
          treemacs-width                           35
          treemacs-width-increment                 1
          treemacs-width-is-initially-locked       t
          treemacs-workspace-switch-cleanup        nil)
    (treemacs-resize-icons 15)
    (treemacs-project-follow-mode t)
    (treemacs-follow-mode t)
    (treemacs-filewatch-mode t)
    (treemacs-fringe-indicator-mode 'always)))

  (use-package treemacs-evil
    :after (treemacs evil)
    :ensure t)

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

  (use-package treemacs-magit
    :after (treemacs magit)
    :ensure t)
 

Vterm

;;vterm
(use-package vterm
  :commands vterm
  :config
  (setq vterm-shell "zsh")
  (setq vterm-max-scrollback 10000))

Calendar calfw

;;org-mode calendar
(use-package calfw-org)
(setq calendar-week-start-day 1)

Magit

;;magit
(use-package magit
  :ensure t)

Git-gutter

;;git-gutter
(use-package git-gutter
  :hook (prog-mode . git-gutter-mode)
  :config
  (setq git-gutter:update-interval 0.02))

WhichKey

;;whichKey
(use-package which-key
  :defer 0
  :diminish which-key-mode
  :config
  (which-key-mode)
  (setq which-key-idle-delay 1))

Commenter

;;commenting
(use-package evil-nerd-commenter
  :bind ("C-/" . evilnc-comment-or-uncomment-lines))

Rainbow delimiters

;;Rainbow delimiters
(use-package rainbow-delimiters
  :hook (prog-mode . rainbow-delimiters-mode))

Colorize color names

;;colorize color names
(use-package rainbow-mode
  :config
  (setq rainbow-ansi-colors nil)
  (setq rainbow-x-colors nil))

WakaTime

;;WakaTime
(use-package wakatime-mode)
(global-wakatime-mode)

undo-fu

;; Better undo
(use-package undo-fu)
(use-package undo-fu-session
  :config
  (setq undo-fu-session-incompatible-files '("/COMMIT_EDITMSG\\'" "/git-rebase-todo\\'")))
(undo-fu-session-global-mode)
(setq undo-fu-session-directory "~/.emacs.d/undo-history")

;;undo-tree
(use-package vundo)

Zoom

;; Resize splits 
(use-package zoom
  :ensure t
  :init (zoom-mode t))

Ledger

;; Ledger for finances 
(use-package ledger-mode
  :ensure t
  :config
  (defun ledger-mode-clean-buffer-after-save ()
    (when (eq major-mode 'ledger-mode)
      (ledger-mode-clean-buffer)))

  (add-hook 'after-save-hook 'ledger-mode-clean-buffer-after-save))

Solaire mode

;; Solaire mode 
(use-package solaire-mode
  :ensure t
  :init (solaire-global-mode t))

Other configs

;;; Other configurations

;; always ask for `y` or `n` instead of `yes` or `no`
(defalias 'yes-or-no-p 'y-or-n-p)

;;scrolling
(setq scroll-margin 8
      scroll-step 1
      scroll-conservatively 10000
      scroll-preserve-screen-position 1)

;; set tab to 4 spaces
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux")
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

;; autocomplete brackets
(electric-pair-mode t)

;; set custom
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file)

;; backup directorie
(setq backup-directory-alist '(("." . "~/.emacs.d/backup"))
    backup-by-copying t    ; Don't delink hardlinks
    version-control t      ; Use version numbers on backups
    delete-old-versions t  ; Automatically delete excess backups
    kept-new-versions 20   ; how many of the newest versions to keep
    kept-old-versions 5    ; and how many of the old
    )

;; open a browser and search
(defun search (url)
  "Opens a browser and search URL DuckDuckGo for the given string."
  (interactive "sSearch for: ")
  (browse-url (concat "http://www.duckduckgo.com/?q="
                      (url-hexify-string url))))

;;redefine dired-find-file to open on custom program
(define-key dired-mode-map [remap dired-find-file] 'dired-open-file)