#+TITLE: Materus Emacs Cfg #+AUTHOR: materus #+DESCRIPTION: materus emacs configuration #+STARTUP: overview #+PROPERTY: header-args :tangle etc/materus/emacs-config.el :comments link #+OPTIONS: \n:t #+auto_tangle: t My emacs config, tangled file is [[file:etc/materus/emacs-config.el][there]] * Table of Contents :noexport:TOC_3: - [[#init-files][Init Files]] - [[#early-init][Early Init]] - [[#early-init-variables][Early Init Variables]] - [[#garbage-collector][Garbage Collector]] - [[#early-frame-settings][Early Frame Settings]] - [[#native-compilation][Native compilation]] - [[#init][Init]] - [[#compile-time][Compile Time]] - [[#packages][Packages]] - [[#init-package-manager-config][Init package manager config]] - [[#packages-list--function][Packages list & function]] - [[#configuration][Configuration]] - [[#no-littering][No Littering]] - [[#graphical][Graphical]] - [[#mouse][Mouse]] - [[#misc][Misc]] - [[#dashboard][Dashboard]] - [[#modeline][Modeline]] - [[#org-mode][Org-mode]] - [[#completions][Completions]] - [[#minibuffer][Minibuffer]] - [[#code-completion][Code completion]] - [[#terms][Terms]] - [[#eat][Eat]] - [[#miscellaneous][Miscellaneous]] - [[#defaults][Defaults]] - [[#elcord][Elcord]] - [[#undo-tree][Undo-Tree]] - [[#projectile][Projectile]] - [[#treemacs][Treemacs]] - [[#magit][Magit]] - [[#dirvish][Dirvish]] - [[#perspective][Perspective]] - [[#programming][Programming]] - [[#lsp][LSP]] - [[#nix][Nix]] - [[#emacs-lisp][Emacs Lisp]] - [[#cc][C/C++]] - [[#python][Python]] - [[#java][Java]] - [[#other][Other]] - [[#keybindings][Keybindings]] - [[#snippets][Snippets]] - [[#yasnippet-init][Yasnippet init]] - [[#other-1][Other]] - [[#update-config-script][Update config script]] - [[#byte-compile][Byte compile]] - [[#test][Test]] * Init Files ** Early Init :PROPERTIES: :header-args: :tangle early-init.el :comments link :END: Early init file, setting for GC and some paths. Tangled file is [[./early-init.el][there]] #+begin_src emacs-lisp :comments no ;;; -*- lexical-binding: t; -*- #+end_src *** Early Init Variables Setting early init variables #+begin_src emacs-lisp (defvar materus/init-early t "Is emacs using materus early init") ; Var to ensure early-init loaded, not used anymore but keeping it anyway (setq materus/init-early t) ; Probably useless (setenv "LSP_USE_PLISTS" "true") ; Make lsp-mode use plists ;; (setq c-default-style nil) ; Clear default styles for languages, will set them up later (setq default-input-method nil) ; Disable default input method, I'm not using them anyway so far (setq initial-major-mode 'fundamental-mode) ; Use fundamental mode in scratch buffer, speed up loading, not really important when emacs used as daemon (setq auto-save-default nil) ; TODO: configure auto saves, disable for now (setq backup-directory-alist `((".*" . ,(concat user-emacs-directory "var/backups/")))) ; Set backup location (setq auto-save-file-name-transforms `((".*" ,(concat user-emacs-directory "var/recovery/") t))) ; Set auto-save location (setq auto-save-list-file-prefix (concat user-emacs-directory "var/auto-save/sessions/")) ; Set auto-save-list location (setq load-prefer-newer t) ; Prefer newer files to load ;; Packages (setq package-enable-at-startup t) ; Ensure packages are enable since I'm either using built in package manager or nix (setq package-quickstart nil) ; Disable package quickstart, it's annoying if forget to update it and doesn't speed up much (add-to-list 'load-path (concat user-emacs-directory "etc/materus/extra")) ; Extra load path for packages (setq package-user-dir (concat user-emacs-directory "var/elpa/" emacs-version "/" )) ; Set elpa path for this emacs version, should use nix packages anyway so keeping just in case (setq package-gnupghome-dir (concat user-emacs-directory "var/elpa/gnupg/" )) ; Set path to gnupg for elpa (add-to-list 'package-archives '("nongnu-devel" . "https://elpa.nongnu.org/nongnu-devel/")) ; Add nongnu-devel repo to package manager (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) ; Add melpa repo to package manager (customize-set-variable 'package-archive-priorities '(("gnu" . 99) ("nongnu" . 80) ("nongnu-devel" . 70) ("melpa" . 0))) ; Repository priority ;; (setq inhibit-compacting-font-caches t) ; Don't compact fonts (set-language-environment "UTF-8") ; Use UTF-8 (setq custom-file (concat user-emacs-directory "etc/custom.el")) ; Set custom file location, don't want clutter in main directory (setq custom-theme-directory (expand-file-name "/etc/materus/themes/" user-emacs-directory)) ; Set custom themes location (setq ring-bell-function 'ignore) ; Disable bell (defvar materus-emacs-gc-cons-threshold (* 32 1024 1024) "The value of `gc-cons-threshold' after Emacs startup.") ; Define after init garbage collector threshold #+end_src *** Garbage Collector Settings for garbage collector #+begin_src emacs-lisp (setq gc-cons-threshold most-positive-fixnum) ; Set `gc-cons-threshold' so it won't collectect during initialization (add-hook 'emacs-startup-hook (lambda () (setq gc-cons-threshold materus-emacs-gc-cons-threshold))) ; Set `gc-cons-threshold' to desired value after startup #+end_src *** Early Frame Settings Early frame settings, maybe some could be move to normal init #+begin_src emacs-lisp (setq frame-inhibit-implied-resize t) (setq frame-resize-pixelwise t) (setq window-resize-pixelwise t) ; Allow pixelwise resizing of window and frame (unless (daemonp) (add-to-list 'initial-frame-alist '(fullscreen . maximized))) ; Start first frame maximized if not running as daemon, daemon frame are set up later in config (setq default-frame-alist ; Set default size for frames '((width . 130) (height . 40))) (advice-add #'tty-run-terminal-initialization :override #'ignore) (add-hook 'window-setup-hook (lambda () (unless (display-graphic-p) (advice-remove #'tty-run-terminal-initialization #'ignore) (tty-run-terminal-initialization (selected-frame) nil t) ))) #+end_src *** Native compilation #+begin_src emacs-lisp (setq native-comp-async-report-warnings-errors nil) ; Silence warnings (setq native-comp-speed 3) ; Set native-comp speed (setq native-comp-jit-compilation t ;native-comp-deferred-compilation t package-native-compile t) ;; Setting up native-comp cache location (when (and (fboundp 'startup-redirect-eln-cache) (fboundp 'native-comp-available-p) (native-comp-available-p)) (startup-redirect-eln-cache (convert-standard-filename (expand-file-name "var/eln-cache/" user-emacs-directory)))) #+end_src ** Init :PROPERTIES: :header-args: :tangle init.el :END: Init File Checking if using emacs from my nix config (not used anymore, might use in future), loads config and custom.el #+begin_src emacs-lisp :comments no ;;; -*- lexical-binding: t; -*- #+end_src #+begin_src emacs-lisp (setq-default materus/use-nix-packages (require 'materus-config nil 'noerror)) (load (concat user-emacs-directory "etc/materus/nix-init") t) (load (concat user-emacs-directory "etc/materus/emacs-config")) (load custom-file t) #+end_src ** Compile Time #+begin_src emacs-lisp :comments no ;;; -*- lexical-binding: t; -*- #+end_src #+begin_src emacs-lisp (eval-when-compile (defvar doom-modeline-support-imenu nil) (defvar display-time-24hr-format nil) (defvar lsp-nix-nixd-formatting-command nil) (defvar cua--cua-keys-keymap nil) (declare-function lsp-stdio-connection "lsp-mode" (COMMAND &optional TEST-COMMAND)) (declare-function make-lsp-client "lsp-mode") (declare-function lsp-register-client "lsp-mode" ( CLIENT )) ) #+end_src * Packages Package manager config if not using nix. After some testing default package manager works best for me. ** Init package manager config #+begin_src emacs-lisp (require 'cl-lib) (require 'package) #+end_src ** Packages list & function Packages to install #+begin_src emacs-lisp (defvar materus/packages '( use-package elcord dashboard magit git-timemachine avy vterm direnv projectile clipetty which-key iedit hideshowvis evil perspective treemacs-evil treemacs treemacs-nerd-icons treemacs-perspective treemacs-icons-dired treemacs-magit treemacs-projectile tree-edit nerd-icons nerd-icons-completion minions rainbow-delimiters rainbow-mode cmake-mode lsp-mode lsp-java lsp-jedi lsp-haskell lsp-ui lsp-treemacs flycheck gradle-mode groovy-mode kotlin-mode dap-mode d-mode lua-mode multiple-cursors org org-contrib org-ql org-rainbow-tags org-roam org-roam-ui org-review org-present org-superstar org-auto-tangle visual-fill-column csharp-mode markdown-mode json-mode nix-mode nixfmt no-littering right-click-context dracula-theme doom-themes doom-modeline popper undo-tree bash-completion eldoc-box yasnippet async request nix-ts-mode markdown-ts-mode llvm-ts-mode treesit-fold treesit-auto tree-sitter-langs eat vlf edit-indirect zones sudo-edit toc-org empv volatile-highlights highlight elfeed elfeed-goodies drag-stuff dirvish rg shfmt ;; Completions & Minibuffer corfu company company-quickhelp cape embark embark-consult orderless vertico marginalia ) "A list of packages to ensure are installed at launch.") (defun materus/packages-installed-p () (cl-loop for p in materus/packages when (not (package-installed-p p)) do (cl-return nil) finally (cl-return t))) (defun materus/install-packages () (unless (materus/packages-installed-p) (package-refresh-contents) (dolist (p materus/packages) (when (not (package-installed-p p)) (package-install p))))) (unless materus/use-nix-packages (materus/install-packages)) #+end_src * Configuration General configurations of packages modes etc. ** No Littering Set up no littering #+begin_src emacs-lisp (require 'recentf) (use-package no-littering :config (setq package-quickstart-file (concat user-emacs-directory "var/quickstart/package-quickstart-" emacs-version ".el" )) (add-to-list 'recentf-exclude (recentf-expand-file-name no-littering-var-directory)) (add-to-list 'recentf-exclude (recentf-expand-file-name no-littering-etc-directory))) (setq custom-theme-directory (concat user-emacs-directory "etc/themes")) (add-to-list 'custom-theme-load-path custom-theme-directory) #+end_src ** Graphical Graphical related settings. *** Mouse #+begin_src emacs-lisp (context-menu-mode 1) (setq mouse-wheel-follow-mouse 't) (setq scroll-step 1) (setq mouse-drag-and-drop-region t) (xterm-mouse-mode 1) (pixel-scroll-precision-mode 1) (setq-default pixel-scroll-precision-large-scroll-height 10.0) #+end_src *** Misc #+begin_src emacs-lisp (when (daemonp) (add-hook 'after-make-frame-functions (lambda (frame) (when (= (length (frame-list)) 2) (set-frame-parameter frame 'fullscreen 'maximized))))) (when (display-graphic-p) (set-frame-font "Hack Nerd Font" nil t) ) (setq-default display-line-numbers-width 3) (global-tab-line-mode 1) (tool-bar-mode -1) (setq-default cursor-type '(bar . 1)) ;; Rainbow mode (use-package rainbow-mode :hook ((org-mode . rainbow-mode) (prog-mode . rainbow-mode))) ;; Delimiters (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode) :config (custom-set-faces '(rainbow-delimiters-depth-1-face ((t (:foreground "#FFFFFF")))) '(rainbow-delimiters-depth-2-face ((t (:foreground "#FFFF00")))) '(rainbow-delimiters-depth-5-face ((t (:foreground "#6A5ACD")))) '(rainbow-delimiters-unmatched-face ((t (:foreground "#FF0000"))))) ) ;; Nerd Icons (use-package nerd-icons) (use-package nerd-icons-completion :after (marginalia) :config (nerd-icons-completion-mode 1) (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) ;; Theme (use-package dracula-theme :config (if (daemonp) (add-hook 'after-make-frame-functions (lambda (frame) (with-selected-frame frame (load-theme 'dracula t)))) (load-theme 'dracula t))) (defun startup-screen-advice (orig-fun &rest args) (when (= (seq-count #'buffer-file-name (buffer-list)) 0) (apply orig-fun args))) (advice-add 'display-startup-screen :around #'startup-screen-advice) ; Hide startup screen if started with file #+end_src *** Dashboard #+begin_src emacs-lisp (use-package dashboard :after (nerd-icons projectile) :config (setq dashboard-center-content t) (setq dashboard-display-icons-p t) (setq dashboard-icon-type 'nerd-icons) (setq dashboard-projects-backend 'projectile) (setq dashboard-items '((recents . 5) (bookmarks . 5) (projects . 5) (agenda . 5) (registers . 5))) (dashboard-setup-startup-hook) (when (daemonp) (setq initial-buffer-choice (lambda () (get-buffer "*dashboard*"))) ; Show dashboard when emacs is running as daemon ) ) #+end_src *** Modeline #+begin_src emacs-lisp (use-package doom-modeline :init (setq doom-modeline-support-imenu t) :hook (after-init . doom-modeline-mode) :config (setq doom-modeline-icon t) (setq doom-modeline-project-detection 'auto) (setq doom-modeline-height 20) (setq doom-modeline-enable-word-count t) (setq doom-modeline-minor-modes t) (setq display-time-24hr-format t) (display-time-mode 1) (column-number-mode 1) (line-number-mode 1)) (use-package minions :hook (after-init . minions-mode)) #+end_src ** Org-mode Org mode settings #+begin_src emacs-lisp (use-package org :mode (("\\.org$" . org-mode)) :hook ((org-mode . org-indent-mode) (org-mode . display-line-numbers-mode) ) :config (require 'org-mouse) (require 'org-tempo) (setq org-src-window-setup 'current-window) (add-hook 'org-mode-hook (lambda () (setq-local electric-pair-inhibit-predicate `(lambda (c) (if (char-equal c ?<) t (,electric-pair-inhibit-predicate c))))))) (use-package org-superstar :after (org) :hook (org-mode . org-superstar-mode)) :config (setq org-superstar-leading-bullet " ") (use-package org-auto-tangle :after (org) :hook (org-mode . org-auto-tangle-mode)) (use-package toc-org :after (org) :hook ((org-mode . toc-org-mode ) (markdown-mode . toc-org-mode))) #+end_src ** Completions *** Minibuffer #+begin_src emacs-lisp (use-package consult) (use-package marginalia) (use-package orderless) (use-package which-key :config (which-key-mode 1)) (use-package vertico :after (consult marginalia) :config (setq completion-in-region-function (lambda (&rest args) (apply (if vertico-mode #'consult-completion-in-region #'completion--in-region) args))) (vertico-mode 1) (marginalia-mode 1)) (use-package vertico-mouse :config (vertico-mouse-mode 1)) #+end_src *** Code completion #+begin_src emacs-lisp (use-package company :config (setq global-corfu-minibuffer nil) (global-company-mode 1)) #+end_src ** Terms *** Eat #+begin_src emacs-lisp (use-package eat) #+end_src ** Miscellaneous Other configs *** Defaults #+begin_src emacs-lisp (setq-default buffer-file-coding-system 'utf-8-unix) #+end_src *** Elcord #+begin_src emacs-lisp (defun materus/elcord-toggle (&optional _frame) "Toggle elcord based on visible frames" (if (> (length (frame-list)) 1) (elcord-mode 1) (elcord-mode -1)) ) (use-package elcord :config (unless (daemonp) (elcord-mode 1)) (add-hook 'after-delete-frame-functions 'materus/elcord-toggle) (add-hook 'server-after-make-frame-hook 'materus/elcord-toggle)) #+end_src *** Undo-Tree #+begin_src emacs-lisp (use-package undo-tree :config (global-undo-tree-mode 1) (defvar materus/undo-tree-dir (concat user-emacs-directory "var/undo-tree/")) (unless (file-exists-p materus/undo-tree-dir) (make-directory materus/undo-tree-dir t)) (setq undo-tree-visualizer-diff t) (setq undo-tree-history-directory-alist `(("." . ,materus/undo-tree-dir ))) (setq undo-tree-visualizer-timestamps t) ) #+end_src *** Projectile #+begin_src emacs-lisp (use-package projectile :config (projectile-mode 1)) #+end_src *** Treemacs #+begin_src emacs-lisp (use-package treemacs) (use-package treemacs-projectile :after (projectile treemacs)) (use-package treemacs-nerd-icons :after (nerd-icons treemacs)) (use-package treemacs-perspective :after (treemacs)) (use-package treemacs-mouse-interface :after (treemacs)) #+end_src *** Magit #+begin_src emacs-lisp (use-package magit) #+end_src *** Dirvish #+begin_src emacs-lisp (use-package dirvish :config (dirvish-override-dired-mode 1) (setq dirvish-attributes '(vc-state subtree-state nerd-icons collapse git-msg file-time file-size))) #+end_src *** Perspective #+begin_src emacs-lisp (require 'perspective) (customize-set-variable 'persp-mode-prefix-key (kbd "C-c M-p")) (persp-mode 1) #+end_src * Programming ** LSP #+begin_src emacs-lisp (use-package lsp-mode) (use-package lsp-ui) (use-package dap-mode) (use-package dap-lldb) (use-package dap-gdb-lldb) (setq read-process-output-max (* 1024 1024 3)) (defun lsp-booster--advice-json-parse (old-fn &rest args) "Try to parse bytecode instead of json." (or (when (equal (following-char) ?#) (let ((bytecode (read (current-buffer)))) (when (byte-code-function-p bytecode) (funcall bytecode)))) (apply old-fn args))) (advice-add (if (progn (require 'json) (fboundp 'json-parse-buffer)) 'json-parse-buffer 'json-read) :around #'lsp-booster--advice-json-parse) (defun lsp-booster--advice-final-command (old-fn cmd &optional test?) "Prepend emacs-lsp-booster command to lsp CMD." (let ((orig-result (funcall old-fn cmd test?))) (if (and (not test?) ;; for check lsp-server-present? (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper lsp-use-plists (not (functionp 'json-rpc-connection)) ;; native json-rpc (executable-find "emacs-lsp-booster")) (progn (when-let* ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH) (setcar orig-result command-from-exec-path)) (message "Using emacs-lsp-booster for %s!" orig-result) (cons "emacs-lsp-booster" orig-result)) orig-result))) (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) #+end_src ** Nix #+begin_src emacs-lisp (use-package nix-mode) (use-package nix-ts-mode) (use-package nixfmt) (use-package lsp-nix) (with-eval-after-load 'lsp-mode (add-to-list 'lsp-disabled-clients '(nix-mode . nix-nil)) (setq lsp-nix-nixd-server-path "nixd" lsp-nix-nixd-formatting-command [ "nixfmt" ] lsp-nix-nixd-nixpkgs-expr "import { }")) (setq lsp-nix-nixd-formatting-command "nixfmt") (add-hook 'nix-mode-hook 'lsp-deferred) (add-hook 'nix-mode-hook 'display-line-numbers-mode) ;;(add-hook 'nix-ts-mode-hook 'lsp-deferred) ;;(add-hook 'nix-ts-mode-hook 'display-line-numbers-mode) ;;(when (treesit-language-available-p 'nix) (push '(nix-mode . nix-ts-mode) major-mode-remap-alist)) #+end_src ** Emacs Lisp #+begin_src emacs-lisp (add-hook 'emacs-lisp-mode-hook 'display-line-numbers-mode) #+end_src ** C/C++ #+begin_src emacs-lisp (use-package lsp-clangd) (setq lsp-clients-clangd-args '("--fallback-style=microsoft")) (add-hook 'c-mode-hook 'lsp-deferred) (add-hook 'c-mode-hook 'display-line-numbers-mode) ;(add-hook 'c-ts-mode-hook 'lsp-deferred) ;(add-hook 'c-ts-mode-hook 'display-line-numbers-mode) (add-hook 'c++-mode-hook 'lsp-deferred) (add-hook 'c++-mode-hook 'display-line-numbers-mode) ;(add-hook 'c++-ts-mode-hook 'lsp-deferred) ;(add-hook 'c++-ts-mode-hook 'display-line-numbers-mode) ;(when (treesit-language-available-p 'c) (push '(c-mode . c-ts-mode) major-mode-remap-alist)) ;(when (treesit-language-available-p 'cpp) (push '(c++-mode . c++-ts-mode) major-mode-remap-alist)) (add-to-list 'c-default-style '(c-mode . "bsd")) (add-to-list 'c-default-style '(c++-mode . "bsd")) ;(add-to-list 'c-default-style '(c-ts-mode . "bsd")) ;(add-to-list 'c-default-style '(c++-ts-mode . "bsd")) #+end_src ** Python #+begin_src emacs-lisp (use-package lsp-pyright) (setq lsp-pyright-langserver-command "pyright") (add-hook 'python-mode-hook 'lsp-deferred) #+end_src ** Java #+begin_src emacs-lisp (use-package lsp-java) (setq lsp-java-vmargs '("-XX:+UseParallelGC" "-XX:GCTimeRatio=4" "-XX:AdaptiveSizePolicyWeight=90" "-Dsun.zip.disableMemoryMapping=true" "-Xmx2G" "-Xms100m")) (add-hook 'java-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) (add-hook 'java-mode-hook 'lsp-deferred) (add-hook 'java-mode-hook 'display-line-numbers-mode) ;(add-hook 'java-ts-mode-hook (lambda () (when (getenv "JDTLS_PATH") (setq lsp-java-server-install-dir (getenv "JDTLS_PATH"))))) ;(add-hook 'java-ts-mode-hook 'lsp-deferred) ;(add-hook 'java-ts-mode-hook 'display-line-numbers-mode) ;(when (treesit-language-available-p 'java) (push '(java-mode . java-ts-mode) major-mode-remap-alist)) (add-to-list 'c-default-style '(java-mode . "java")) (add-to-list 'c-default-style '(java-ts-mode . "java")) #+end_src ** Other #+begin_src emacs-lisp (add-to-list 'c-default-style '(awk-mode . "awk")) (add-to-list 'c-default-style '(other . "bsd")) (setq-default c-basic-offset 4) (setq-default c-indent-level 4) (setq-default c-hungry-delete-key t) (electric-pair-mode 1) (electric-indent-mode -1) (setq-default tab-width 4) (setq-default indent-tabs-mode nil) (add-hook 'prog-mode-hook 'display-line-numbers-mode) (add-hook 'prog-mode-hook 'electric-indent-local-mode) #+end_src * Keybindings #+begin_src emacs-lisp (use-package cua-base) ;;; Keybinds ;; Eat Term (keymap-set eat-semi-char-mode-map "C-v" #'eat-yank) (keymap-set eat-char-mode-map "C-V" #'eat-yank) ;; perspective (global-set-key (kbd "C-x C-b") 'persp-list-buffers) (global-set-key (kbd "C-x C-B") 'list-buffers) (global-set-key (kbd "C-x B") 'persp-switch-to-buffer) ;; CUA (keymap-set cua--cua-keys-keymap "C-z" 'undo-tree-undo) (keymap-set cua--cua-keys-keymap "C-y" 'undo-tree-redo) (cua-mode 1) ;; TAB (keymap-set global-map "C-" #'indent-rigidly-left-to-tab-stop) (keymap-set global-map "C-" #'indent-rigidly-right-to-tab-stop) ;; Hyper (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) (define-key key-translation-map (kbd "") 'event-apply-hyper-modifier ) (define-key key-translation-map (kbd "∇") 'event-apply-hyper-modifier ) (global-set-key (kbd "C-H-t") 'treemacs) #+end_src * Snippets ** Yasnippet init #+begin_src emacs-lisp (use-package yasnippet :config (yas-global-mode 1)) #+end_src * Other ** Update config script #+begin_src emacs-lisp (defun materus/sync-config () "Function to sync config from MATERUS_CONFIG_DIR to emacs folder" (if (getenv "MATERUS_CONFIG_DIR") (progn (copy-directory (concat (getenv "MATERUS_CONFIG_DIR") "extraFiles/config/emacs/") user-emacs-directory t t t) t) (progn (message "Can't use if MATERUS_CONFIG_DIR is not set!") nil))) (defun materus/compare-file-time (file1 file2) "Returns t when file1 is newer than file2" (time-less-p (nth 5 (file-attributes file2)) (nth 5 (file-attributes file1)) )) (defun materus/compile-if-needed (file) (unless (and (file-exists-p (concat user-emacs-directory file "c")) (materus/compare-file-time (concat user-emacs-directory file "c") (concat user-emacs-directory file))) (byte-compile-file (concat user-emacs-directory file))) ) (defun materus/compile-config-if-needed () (materus/compile-if-needed "early-init.el") (materus/compile-if-needed "init.el") (materus/compile-if-needed "etc/materus/emacs-config.el")) (defun materus/update-config () "Will sync and compile config" (interactive) (when (materus/sync-config) (materus/compile-config-if-needed) (byte-recompile-directory (concat user-emacs-directory "etc/materus/extra") 0 t))) #+end_src ** Byte compile Byte compile files. #+begin_src emacs-lisp (materus/compile-config-if-needed) #+end_src * Test Just for testing some code #+begin_src emacs-lisp ;;; (global-set-key (kbd "C-∇") (kbd "C-H")) ;;; (global-set-key (kbd "H-∇") (lambda () (interactive) (insert-char #x2207))) ;;; (setq completion-styles '(orderless basic) ;;; completion-category-defaults nil ;;; completion-category-overrides '((file (styles partial-completion)))) #+end_src