#+TITLE: My Emacs Configuration #+AUTHOR: Arthur Barraux #+OPTIONS: num:nil * Init ** Package management #+begin_src emacs-lisp ;; 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) #+end_src ** Git #+begin_src emacs-lisp (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) #+end_src ** Prolog #+begin_src emacs-lisp (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)) #+end_src ** Dired #+begin_src emacs-lisp (use-package dired-preview) (use-package dired-git :hook (dired-mode . dired-git-mode)) #+end_src ** Theme #+BEGIN_SRC emacs-lisp (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], 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))) #+END_SRC ** Encoding #+begin_src emacs-lisp (set-language-environment "UTF-8") (prefer-coding-system 'utf-8) #+end_src * Completion ** Yas-snippet #+begin_src emacs-lisp (use-package yasnippet :ensure t :config (yas-global-mode 1)) (use-package yasnippet-snippets :ensure t) #+end_src ** Helm #+begin_src emacs-lisp (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) #+end_src ** Company #+BEGIN_SRC emacs-lisp (use-package company :hook (after-init . global-company-mode) :custom (company-backends '(company-capf))) (use-package company-box :hook (company-mode . company-box-mode)) #+END_SRC ** Smart parenthesis #+begin_src emacs-lisp (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)) #+end_src ** Flycheck #+begin_src emacs-lisp (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))) #+end_src ** LSP #+begin_src emacs-lisp ;; 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-" . 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)) #+end_src * Key-binds ** Buffer #+begin_src emacs-lisp (keymap-global-set "M-a" 'switch-to-buffer) #+end_src ** C *** Dereference arrow #+BEGIN_SRC emacs-lisp (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) #+END_SRC ** Reload config #+BEGIN_SRC emacs-lisp (defun reload-conf () (interactive) (load-file "~/.emacs.default/init.el")) (keymap-global-set "C-c r" 'reload-conf) #+END_SRC ** Open config #+begin_src emacs-lisp (defun open-config () (interactive) (find-file "~/.emacs.default/config.org")) (keymap-global-set "C-c c" 'open-config) #+end_src ** Window command *** Split verticaly #+begin_src emacs-lisp (keymap-global-set "C-x é" 'split-window-below) #+end_src *** Split horizontally #+begin_src emacs-lisp (keymap-global-set "C-x \"" 'split-window-right) #+end_src *** Close window #+begin_src emacs-lisp (keymap-global-set "C-x à" 'delete-window) #+end_src *** Switch window #+begin_src emacs-lisp (keymap-global-set "C-x :" 'next-window-any-frame) #+end_src * Org #+begin_src emacs-lisp (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) #+end_src * Hooks ** Variable pitch mode #+begin_src emacs-lisp (add-hook 'org-mode-hook 'variable-pitch-mode) #+end_src ** Visual line mode #+begin_src emacs-lisp (add-hook 'org-mode-hook 'visual-line-mode) #+end_src ** Menu bar #+BEGIN_SRC emacs-lisp (add-hook 'before-make-frame-hook (lambda () (menu-bar-mode -1))) #+END_SRC ** Tool bar #+BEGIN_SRC emacs-lisp (add-hook 'before-make-frame-hook (lambda () (tool-bar-mode -1))) #+END_SRC ** Scroll bar #+BEGIN_SRC emacs-lisp (add-hook 'before-make-frame-hook (lambda () (scroll-bar-mode -1))) #+END_SRC ** Prog #+begin_src emacs-lisp (add-hook 'prog-mode-hook 'git-gutter-mode) #+end_src * Terminal #+begin_src emacs-lisp (use-package vterm :bind ("C-x t" . vterm)) #+end_src * Projectile #+begin_src emacs-lisp (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))) #+end_src * Misceleaneous ** Indentation #+begin_src emacs-lisp (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) #+end_src ** Global font #+begin_src emacs-lisp (set-face-attribute 'default nil :family "Cascadia Mono" :height 140) #+end_src ** Icons #+begin_src emacs-lisp (use-package all-the-icons :if (display-graphic-p)) #+end_src ** Delete backup files #+begin_src emacs-lisp (setq make-backup-files nil) #+end_src ** Line numberring #+begin_src emacs-lisp (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) #+end_src ** Smooth scroll #+begin_src emacs-lisp (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)) #+end_src ** Startup screen #+begin_src emacs-lisp (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*") #+end_src