#+TITLE: Emacs Init File #+AUTHOR: Daniel Ziltener * Initialization ** Requirements Since I am using ~cl-defun~ in this init file, I need to import ~cl-macs~. #+begin_src emacs-lisp (require 'cl-macs) #+end_src ** Personal Information #+NAME: pers-info-table | Name | Mail | |-----------------+---------------------| | Daniel Ziltener | dziltener@lyrion.ch | #+begin_src emacs-lisp :var input=pers-info-table (let ((row (car input))) (setq user-full-name (cl-first row)) (setq user-mail-address (cl-second row))) #+end_src For storage of passwords, I use [[https://www.passwordstore.org/][pass]]: src_emacs-lisp[]{(auth-source-pass-enable)} ** Customizations Since this init file is version controlled, and I set all customizations myself in =use-package= blocks, I want Emacs to use a separate file for authorized =.dir-local= variables and similar stuff. #+begin_src emacs-lisp (setq custom-file "~/.emacs.d/custom.el") (when (file-exists-p custom-file) (load custom-file)) #+end_src ** Package Manager I use =straight.el= as package manager. #+NAME: straight-settings | Setting | Value | |-------------------------+-------| | Use Straight as default | f | #+begin_src emacs-lisp :var tbl=straight-settings (defvar bootstrap-version) (let ((bootstrap-file (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory)) (bootstrap-version 6)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) (let ((settings (car tbl))) (setq straight-use-package-by-default (string= "t" (cl-first settings)))) #+end_src * Helper Functions Those are meant to reduce code duplication, and add some basic useful features. The first one is a function to create conditional keybindings. #+BEGIN_SRC emacs-lisp (cl-defun conditional-keybind "Creates a keybinding that checks `filter-fn`. If it succeeds, `target-fn` is run, otherwise `fail-fn`. If no fail-fn is given, `self-insert-command` is run instead. `target-fn` and `fail-fn` must both be interactive." (lambda (_prefix) (interactive "P") (if (funcall filter-fn) (call-interactively target-fn) (call-interactively fail-fn)))) #+end_src * Core Emacs Customization :important: #+begin_src emacs-lisp (use-package emacs :delight (eldoc-mode " 󰙎") :custom (completion-cycle-threshold 10) (display-time-mode t) (enable-recursive-minibuffers t) (enable-remote-dir-locals t) (global-hl-line-mode t) (indent-tabs-mode nil) (menu-bar-mode nil) (minibuffer-prompt-properties (read-only t cursor-intangible t face minibuffer-prompt)) (read-extended-command-predicate #'command-completion-default-include-p) (recentf-mode t) (scroll-bar-mode nil) (tab-always-indent 'complete) (tool-bar-mode nil) :custom-face (default ((t (:weight bold :height 113 :width normal :family "VictorMono Nerd Font")))) :hook (minibuffer-setup . cursor-intangible-mode) :config (advice-add 'risky-local-variable-p :override #'ignore)) #+end_src