Files
Arthur BARRAUX 39e9dcf8af add git markers
2025-06-12 17:04:33 +02:00

15 KiB

My Emacs Configuration

Init

Package management

;; This is only needed once, near the top of the file

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

(setq package-archives
      '(("GNU ELPA"     . "https://elpa.gnu.org/packages/")
        ("MELPA Stable" . "https://stable.melpa.org/packages/")
        ("MELPA"        . "https://melpa.org/packages/"))
      package-archive-priorities
      '(("GNU ELPA"     . 10)
        ("MELPA"        . 5)
        ("MELPA Stable" . 0)))

(unless (package-install 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(eval-when-compile (require 'use-package))
(setq use-package-always-ensure t)
(pdf-tools-install)
(use-package exec-path-from-shell)

Git

  (use-package git-gutter)

  (use-package git-gutter-fringe)

(define-fringe-bitmap 'git-gutter-fr:added [224] nil nil '(center repeated))
(define-fringe-bitmap 'git-gutter-fr:modified [224] nil nil '(center repeated))
(define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240] nil nil 'bottom)

Prolog

(autoload 'run-prolog "prolog" "Start a Prolog sub-process." t)
(autoload 'prolog-mode "prolog" "Major mode for editing Prolog programs." t)
(autoload 'mercury-mode "prolog" "Major mode for editing Mercury programs." t)
(setq prolog-system 'swi)
(setq auto-mode-alist (append '(("\\.pl$" . prolog-mode)
                                ("\\.m$" . mercury-mode))
                               auto-mode-alist))

Dired

  (use-package dired-preview)
  (use-package dired-git
        :hook
        (dired-mode . dired-git-mode))

Theme

(use-package zenburn-theme)
(use-package doom-themes)
(use-package spacemacs-theme)

(load-theme 'spacemacs-dark t)


(use-package vertico
  :custom
  (vertico-cycle t) ;; Enable cycling for `vertico-next/previous'
  :init
  (vertico-mode))

(use-package savehist
  :init
  (savehist-mode))

(use-package emacs
  :custom
  ;; Support opening new minibuffers from inside existing minibuffers.
  (enable-recursive-minibuffers t)
  ;; Hide commands in M-x which do not work in the current mode.  Vertico
  ;; commands are hidden in normal buffers. This setting is useful beyond
  ;; Vertico.
  (read-extended-command-predicate #'command-completion-default-include-p)
  :init
  ;; Add prompt indicator to `completing-read-multiple'.
  ;; We display [CRM<separator>], e.g., [CRM,] if the separator is a comma.
  (defun crm-indicator (args)
    (cons (format "[CRM%s] %s"
                  (replace-regexp-in-string "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" "" crm-separator)
                  (car args))
          (cdr args)))
  (advice-add #'completing-read-multiple :filter-args #'crm-indicator)

  (setq minibuffer-prompt-properties '(read-only t cursor-intangible t face minibuffer-prompt))
  (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode))

(use-package vertico-directory
  :after vertico
  :ensure nil
  ;; More convenient directory navigation commands
  :bind (:map vertico-map
              ("RET" . vertico-directory-enter)
              ("DEL" . vertico-directory-delete-char)
              ("M-DEL" . vertico-directory-delete-word))
  ;; Tidy shadowed file names
  :hook (rfn-eshadow-update-overlay . vertico-directory-tidy))

(use-package vertico-multiform
  :after vertico
  :load-path "~/.emacs.d/elpa/vertico-1.9/")

(vertico-multiform-mode 1)

(use-package vertico-posframe
  :ensure t)
(setq vertico-posframe-parameters
      '((left-fringe . 8)
        (right-fringe . 8)))

Encoding

  (set-language-environment "UTF-8")
  (prefer-coding-system 'utf-8)

Completion

Yas-snippet

  (use-package yasnippet
    :ensure t
    :config
    (yas-global-mode 1))
  (use-package yasnippet-snippets
    :ensure t)

Helm

(use-package helm
  :config (require 'helm-autoloads)
  :bind

  (("M-x". 'helm-M-x)
   ("C-x C-f" . 'helm-find-files)))
(helm-mode 1)
(use-package helm-make
  :bind ("C-x m" . 'helm-make))
(use-package helm-posframe)
(helm-posframe-enable)
(setq helm-recentf-fuzzy-match t
      helm-locate-fuzzy-match nil ;; locate fuzzy is worthless
      helm-M-x-fuzzy-match t
      helm-buffers-fuzzy-matching t
      helm-semantic-fuzzy-match t
      helm-apropos-fuzzy-match t
      helm-imenu-fuzzy-match t
      helm-lisp-fuzzy-completion t
      helm-completion-in-region-fuzzy-match t)

Company

(use-package company
  :hook
  (after-init . global-company-mode)
  :custom
  (company-backends '(company-capf)))
(use-package company-box
  :hook
  (company-mode . company-box-mode))

Smart parenthesis

  (use-package smartparens
    :ensure smartparens  ;; install the package
    :hook (prog-mode text-mode markdown-mode) ;; add `smartparens-mode` to these hooks
    :config
    ;; load default config
    (require 'smartparens-config))

Flycheck

(use-package flycheck
  :init
  (progn
    (define-fringe-bitmap 'my-flycheck-fringe-indicator
      (vector #b00000000
              #b00000000
              #b00000000
              #b00000000
              #b00000000
              #b00000000
              #b00000000
              #b00011100
              #b00111110
              #b00111110
              #b00111110
              #b00011100
              #b00000000
              #b00000000
              #b00000000
              #b00000000
              #b00000000))

    (flycheck-define-error-level 'error
      :severity 2
      :overlay-category 'flycheck-error-overlay
      :fringe-bitmap 'my-flycheck-fringe-indicator
      :fringe-face 'flycheck-fringe-error)

    (flycheck-define-error-level 'warning
      :severity 1
      :overlay-category 'flycheck-warning-overlay
      :fringe-bitmap 'my-flycheck-fringe-indicator
      :fringe-face 'flycheck-fringe-warning)

    (flycheck-define-error-level 'info
      :severity 0
      :overlay-category 'flycheck-info-overlay
      :fringe-bitmap 'my-flycheck-fringe-indicator
      :fringe-face 'flycheck-fringe-info)))

LSP

  ;; Java
  (use-package exec-path-from-shell)
  (use-package lsp-java)
  (require 'lsp-java)
  (use-package hydra)
  (setq lsp-java-jdt-download-url  "https://download.eclipse.org/jdtls/milestones/0.57.0/jdt-language-server-0.57.0-202006172108.tar.gz")

  (use-package lsp-mode
    :init
    ;;set prefix
    (setq lsp-keymap-prefix "C-c l")
    (setq lsp-diagnostics-provider :flycheck) ; Use flycheck for diagnostics
    (setq lsp-enable-snippet t)		  ; Enable snippet support
    (setq company-idle-delay 0.2) ; Set delay for completion pop-up
    (setq company-minimum-prefix-length 1)
    (setq lsp-clients-clangd-executable "clangd")

    :hook
    ((prog-mode . lsp)
     (c-mode . lsp)
     (java-mode . lsp)
     (latex-mode . lsp)
     (python-mode . lsp)
     (lsp-mode . lsp-enable-which-key-integration)
     (before-save . lsp-format-buffer)
     )
    :commands lsp
    :bind
    ("C-<return>" . ff-find-other-file)
    :custom
    (lsp-prefer-capf t))

  (use-package helm-lsp
    :commands helm-lsp-workspace-symbol)

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

Key-binds

Buffer

  (keymap-global-set "M-a" 'switch-to-buffer)

C

Dereference arrow

  (defun print-arrow ()
	(interactive)
  (if (eq major-mode 'c-mode)
    (with-current-buffer (buffer-name);
      (insert "->"))
    (with-current-buffer (buffer-name);
	  (insert "ù"))
    ))
  (keymap-global-set "ù" 'print-arrow)
  (keymap-global-set "∇" 'Control-X-prefix)

Reload config

(defun reload-conf ()
  (interactive)
  (load-file "~/.emacs.default/init.el"))
(keymap-global-set "C-c r" 'reload-conf)

Open config

(defun open-config ()
  (interactive)
  (find-file "~/.emacs.default/config.org"))
(keymap-global-set "C-c c" 'open-config)

Window command

Split verticaly

(keymap-global-set "C-x é" 'split-window-below)

Split horizontally

(keymap-global-set "C-x \"" 'split-window-right)

Close window

(keymap-global-set "C-x à" 'delete-window)

Switch window

(keymap-global-set "C-x :" 'next-window-any-frame)

Org

  (use-package org-superstar)
  (defun my/buffer-face-mode-variable ()
      "Set font to a variable width (proportional) fonts in current buffer"
      (interactive)
      (setq buffer-face-mode-face '(:family "Roboto Slab"
                                    :height 120
                                    :width normal))
      (buffer-face-mode))
  (use-package org-bullets
      :config
      (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))

  (setq org-hide-emphasis-markers t)
  (defun my/set-general-faces-org ()
    (my/buffer-face-mode-variable)
    (setq line-spacing 0.1
          org-pretty-entities t
          org-startup-indented t
          org-adapt-indentation nil)
    (variable-pitch-mode +1)
    (mapc
     (lambda (face) ;; Other fonts that require it are set to fixed-pitch.
       (set-face-attribute face nil :inherit 'fixed-pitch))
     (list 'org-block
           'org-table
           'org-verbatim
           'org-block-begin-line
           'org-block-end-line
           'org-meta-line
           'org-date
           'org-drawer
           'org-property-value
           'org-special-keyword
           'org-document-info-keyword))
    (mapc ;; This sets the fonts to a smaller size
     (lambda (face)
       (set-face-attribute face nil :height 0.8))
     (list 'org-document-info-keyword
           'org-block-begin-line
           'org-block-end-line
           'org-meta-line
           'org-drawer
           'org-property-value
           )))

  (defun my/set-specific-faces-org ()
    (set-face-attribute 'org-code nil
                        :inherit '(shadow fixed-pitch))
    ;; Without indentation the headlines need to be different to be visible
    (set-face-attribute 'org-level-1 nil
                        :height 1.25
                        :foreground "#BEA4DB")
    (set-face-attribute 'org-level-2 nil
                        :height 1.15
                        :foreground "#A382FF"
                        :slant 'italic)
    (set-face-attribute 'org-level-3 nil
                        :height 1.1
                        :foreground "#5E65CC"
                        :slant 'italic)
    (set-face-attribute 'org-level-4 nil
                        :height 1.05
                        :foreground "#ABABFF")
    (set-face-attribute 'org-level-5 nil
                        :foreground "#2843FB")
    (set-face-attribute 'org-date nil
                        :foreground "#ECBE7B"
                        :height 0.8)
    (set-face-attribute 'org-document-title nil
                        :foreground "DarkOrange3"
                        :height 1.3)
    (set-face-attribute 'org-ellipsis nil
                        :foreground "#4f747a" :underline nil)
    (set-face-attribute 'variable-pitch nil
                        :family "Roboto Slab" :height 1.2))



  (defun my/set-keyword-faces-org ()
    (mapc (lambda (pair) (push pair prettify-symbols-alist))
          '(;; Syntax
            ("TODO" .     "")
            ("DONE" .     "")
            ("WAITING" .  "")
            ("HOLD" .     "")
            ("NEXT" .     "")
            ("CANCELLED" . "")
            ("#+begin_quote" . "“")
            ("#+end_quote" . "”")))
    (prettify-symbols-mode +1)
    (org-superstar-mode +1)
    )

  (defun my/style-org ()
    (my/set-general-faces-org)
    (my/set-specific-faces-org)
    (my/set-keyword-faces-org)
    )
  (add-hook 'org-mode-hook 'my/style-org)

  (setq org-return-follows-link t)

Hooks

Variable pitch mode

(add-hook 'org-mode-hook 'variable-pitch-mode)

Visual line mode

(add-hook 'org-mode-hook 'visual-line-mode)

Menu bar

  (add-hook 'before-make-frame-hook (lambda () (menu-bar-mode -1)))

Tool bar

  (add-hook 'before-make-frame-hook (lambda () (tool-bar-mode -1)))

Scroll bar

  (add-hook 'before-make-frame-hook (lambda () (scroll-bar-mode -1)))

Prog

  (add-hook 'prog-mode-hook 'git-gutter-mode)

Terminal

  (use-package vterm
    :bind
    ("C-x t" . vterm))

Projectile

(use-package projectile
  :ensure t
  :init
  (projectile-mode +1)
  :bind (:map projectile-mode-map
              ("M-z" . projectile-command-map)
              ("C-c p" . projectile-command-map)))

Misceleaneous

Indentation

  (use-package rainbow-delimiters)
  (use-package highlight-indent-guides)
  (add-hook 'prog-mode-hook 'highlight-indent-guides-mode)
  (set-variable highlight-indent-guides-method 'column)

Global font

  (set-face-attribute 'default nil :family "Cascadia Mono" :height 140)

Icons

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

Delete backup files

(setq make-backup-files nil)

Line numberring

  (add-hook 'prog-mode-hook 'display-line-numbers-mode)
  (add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
  (setq-default indent-tabs-mode nil)
    (setq-default tab-width 4)

Smooth scroll

  (setq mouse-wheel-scroll-amount '(1 ((shift) . 1) ((control) . nil)))
  (setq mouse-wheel-follow-mouse 't)       ; scroll window under mouse
  (require 'mwheel)
  (setq mouse-wheel-scroll-amount '(3 ((shift) . 1) ((control) . 5)))
  (setq mouse-wheel-inhibit-click-time 0.1)
  (setq scroll-step 1
        scroll-conservatively 10000
        scroll-preserve-screen-position 1)
  (pixel-scroll-mode 1)  ; Enable pixel-level scrolling
  (setq pixel-scroll-precision-large-scroll-height 40.0)
  (use-package smooth-scrolling
    :init
    (smooth-scrolling-mode t))
  (use-package good-scroll
    :ensure t
    :config
    (good-scroll-mode 1))

Startup screen

  (use-package dashboard
    :ensure t
    :config
    (dashboard-setup-startup-hook)
    (setq initial-buffer-choice (lambda () (get-buffer "*dashboard*")))
    (setq server-window (lambda () (switch-to-buffer "*dashboard*"))))
  (setq server-window (lambda () (switch-to-buffer "*dashboard*")))
  (kill-buffer "*scratch*")