#+title: Emacs Configuration #+author: Geir Okkenhaug Jerstad #+email: geir@geokkjer.eu #+options: toc:nil num:nil #+PROPERTY: header-args:emacs-lisp :tangle ~/.emacs.d/init.el * About My attempt at a litterate configuration for Emacs. to tangle this file, run the following command in Emacs: #+BEGIN_SRC emacs-lisp (org-babel-tangle) #+END_SRC or keyboard shortcut `C-c C-v t` (org-babel-tangle) in Emacs. This will generate the `~/.emacs.d/init.el` file with the configuration. * Prep ** Copilot Authentication To use GitHub Copilot, you need to authenticate with your GitHub account. This is done by running the following command in Emacs: after installing the copilot package: Try to trigger the GitHub OAuth flow from within Emacs: #+BEGIN_SRC emacs-lisp :eval yes (call-interactively 'copilot-auth) #+END_SRC * Configuration ** Setup lexical binding Here we set up lexical binding, which is a feature in Emacs Lisp that allows for more efficient variable scoping and function closures. This is recommended for performance reasons. #+BEGIN_SRC emacs-lisp ;; enable lexical binding (setq lexical-binding t) #+END_SRC ** Set automatic update of packages We set up Emacs to automatically update packages on startup. This ensures that we always have the latest versions of the packages we use. #+BEGIN_SRC emacs-lisp (defun geokkjer/display-startup-time () (message "Emacs loaded in %s with %d grabage collections." (format "%.2f seconds" (float-time (time-subtract after-init-time before-init-time))) gcs-done)) (add-hook 'emacs-startup-hook #'geokkjer/display-startup-time) (setq gc-cons-threshold (* 50 1000 1000)) #+END_SRC ** Customize UI Here we set up the UI to our liking. We disable the menu bar, tool bar, and scroll bar, and set the font size to 14pt. #+BEGIN_SRC emacs-lisp ;; disable startup screen (setq inhibit-startup-screen t) ;; disable menu bar (menu-bar-mode -1) ;; disable tool bar (tool-bar-mode -1) ;; disable scroll bar (scroll-bar-mode -1) ;; set font size (set-face-attribute 'default nil :height 140) #+END_SRC Set up doom modeline, which is a nice status line for Emacs. We set it up to show the current buffer name and the current line number. #+BEGIN_SRC emacs-lisp ;; install doom-modeline if not already installed (unless (package-installed-p 'doom-modeline) (package-refresh-contents) (package-install 'doom-modeline)) (require 'doom-modeline) ;; enable doom-modeline (doom-modeline-mode 1) ;; set up doom-modeline to show the current buffer name and line number (setq doom-modeline-buffer-file-name-style 'truncate-with-project) #+END_SRC ** Set up package management #+BEGIN_SRC emacs-lisp ;; set up package archives (require 'package) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("gnu" . "https://elpa.gnu.org/packages/"))) (package-initialize) #+END_SRC ** Install use-package #+BEGIN_SRC emacs-lisp ;; install use-package if not already installed (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (require 'use-package) ;; ensure that use-package is always used (setq use-package-always-ensure t) #+END_SRC ** Org Mode Configure Org-mode for literate programming and note-taking. #+BEGIN_SRC emacs-lisp ;; ensure org-mode is installed and up to date (use-package org :ensure t :mode ("\\.org\\'" . org-mode) :config ;; enable syntax highlighting in code blocks (setq org-src-fontify-natively t) ;; preserve indentation in code blocks (setq org-src-preserve-indentation t) ;; enable babel for code execution (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (shell . t) (python . t) (nix . t))) ;; don't ask for confirmation when evaluating code blocks (setq org-confirm-babel-evaluate nil)) #+END_SRC * Code Completion and ide features ** LSP Mode Here we install lsp-mode and lsp-ui, which are the core components of the LSP (Language Server Protocol) support in Emacs. We also set up keybindings for common LSP commands. #+BEGIN_SRC emacs-lisp ;; install lsp-mode and lsp-ui if not already installed (unless (package-installed-p 'lsp-mode) (package-refresh-contents) (package-install 'lsp-mode)) (unless (package-installed-p 'lsp-ui) (package-refresh-contents) (package-install 'lsp-ui)) (require 'lsp-mode) (require 'lsp-ui) ;; enable lsp-mode in programming buffers (add-hook 'prog-mode-hook #'lsp) #+END_SRC ** GitHub Copilot Here we install from MELPA, enable it in all prog-modes and bind keys for completion: #+BEGIN_SRC emacs-lisp ;; ensure Copilot is installed (unless (package-installed-p 'copilot) (package-refresh-contents) (package-install 'copilot)) (require 'copilot) ;; turn on in programming buffers (add-hook 'prog-mode-hook #'copilot-mode) ;; keybindings: M-TAB to trigger, TAB to accept (define-key copilot-mode-map (kbd "M-TAB") #'copilot-complete) (define-key copilot-completion-map (kbd "") #'copilot-accept-completion) #+END_SRC ** Language support Here we install and configure support for various programming languages. We use the `use-package` macro to ensure that the packages are installed and configured correctly. ** NixOS from Emacs Editing Nix files and doing NixOS admin stuff like nixos-rebuild boot --upgrade Run the commands with M-x shell-command #+BEGIN_SRC emacs-lisp ;; NixOS commands (defun nixos-upgrade () "Run 'nixos-rebuild boot --upgrade' in a shell." (interactive) (shell-command "nixos-rebuild boot --upgrade")) (defun nixos-switch () "Run 'nixos-rebuild switch' in a shell." (interactive) (shell-command "nixos-rebuild switch")) #+END_SRC #+BEGIN_SRC emacs-lisp ;; install nix-mode (use-package nix-mode :ensure t :mode "\\.nix\\'") ;; install nix-repl (use-package nix-repl :ensure t :mode "\\.nix\\'") ;; install nixpkgs (use-package nixpkgs :ensure t :mode "\\.nix\\'") #+END_SRC