emacs-config/config.org

8.4 KiB

Emacs Configuration

Bootstrap

This configuration needs to be loaded by init.el. Create an init.el with this content:

;;; init.el --- Load org config -*- lexical-binding: t -*-
;;; Commentary:
;;; Load literate config from config.org

;;; Code:
(require 'org)
(org-babel-load-file
 (expand-file-name
  "config.org"
  user-emacs-directory))

(provide 'init)
;;; init.el ends here

Performance Optimization

Early-init optimizations for faster Emacs startup.

;; Garbage collection
(setq gc-cons-threshold 100000000)           ; 100mb
(setq read-process-output-max (* 1024 1024)) ; 1mb

;; Faster startup
(setq package-enable-at-startup nil)
(setq site-run-file nil)

Basic UI Configuration

Remove unnecessary UI elements and set basic preferences.

;; Disable unnecessary UI elements
(dolist (mode '(scroll-bar-mode
                tool-bar-mode
                tooltip-mode
                menu-bar-mode))
  (when (fboundp mode) (funcall mode -1)))

(set-fringe-mode 10)
(winner-mode 1)

;; Basic settings
(setq inhibit-startup-message t
      visible-bell nil
      ring-bell-function 'ignore
      use-dialog-box nil
      custom-file (locate-user-emacs-file "custom-vars.el"))

(load custom-file 'noerror 'nomessage)

Package Management

Configure package archives and initialize use-package.

(require 'package)
(setq package-archives
      '(("melpa" . "https://melpa.org/packages/")
        ("org" . "https://orgmode.org/elpa/")
        ("elpa" . "https://elpa.gnu.org/packages/")))

(package-initialize)

;; Bootstrap use-package
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure t)

Theme and Visual Settings

Configure the visual appearance of Emacs.

;; Theme configuration
(use-package catppuccin-theme)
(use-package doom-modeline
  :init (doom-modeline-mode 1)
  :custom
  (doom-modeline-height 35)
  (nerd-icons-scale-factor 1.35)
  (doom-modeline-minor-modes-icon nil)
  (doom-modeline-major-modes-icon nil)
  (doom-modeline-icon t)
  (doom-modeline-time-live-icon t))

;; Load theme
(setq modus-themes-mode-line '(accented borderless padded))
(load-theme 'modus-vivendi t)

;; Font configuration
(set-face-attribute 'default nil :font "FiraCode Nerd Font" :height 125)

;; Line numbers
(column-number-mode)
(global-display-line-numbers-mode t)
(dolist (mode '(term-mode-hook
                vterm-mode-hook))
  (add-hook mode (lambda () (display-line-numbers-mode 0))))

Evil Mode Configuration

Vim keybindings for Emacs.

(use-package evil
  :init
  (setq evil-want-integration t
        evil-want-keybinding nil)
  :config
  (evil-mode 1))

(use-package evil-collection
  :after evil
  :config
  (evil-collection-init))

Completion Framework

Configure Vertico, Orderless, and Marginalia for enhanced completion.

(use-package vertico
  :bind (:map vertico-map
         ("C-j" . vertico-next)
         ("C-k" . vertico-previous)
         ("C-f" . vertico-exit)
         :map minibuffer-local-map
         ("M-h" . backward-kill-word))
  :custom
  (vertico-cycle t)
  :init
  (vertico-mode))

(use-package orderless
  :custom
  (completion-styles '(orderless basic))
  (completion-category-overrides '((file (styles basic partial-completion)))))

(use-package marginalia
  :after vertico
  :custom
  (marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil))
  :init
  (marginalia-mode))

Project Management

Projectile configuration for project management.

(use-package projectile
  :diminish projectile-mode
  :bind
  ("C-M-p" . projectile-find-file)
  :bind-keymap
  ("C-c p" . projectile-command-map)
  :init
  (setq projectile-project-search-path '("~/Code/git.dwavesys.local/"
                                        "~/Code/nikolaishields/"
                                        "~/.emacs.d/"
                                        "/etc/nixos")
        projectile-auto-discover t
        projectile-enable-caching t
        projectile-indexing-method 'alien)
  :config
  (projectile-mode)
  (run-with-idle-timer 10 t #'projectile-discover-projects-in-search-path))

LSP Configuration

Language Server Protocol setup for development.

(use-package lsp-mode
  :init
  (setq lsp-keymap-prefix "C-c l")
  :hook
  ((python-ts-mode . lsp-deferred)
   (go-ts-mode . lsp-deferred)
   (rust-ts-mode . lsp-deferred)
   (js-ts-mode . lsp-deferred)
   (typescript-ts-mode . lsp-deferred)
   (lsp-mode . lsp-enable-which-key-integration))
  :commands (lsp lsp-deferred)
  :custom
  (lsp-enable-symbol-highlighting t)
  (lsp-enable-indentation t)
  (lsp-enable-on-type-formatting t)
  (lsp-modeline-code-actions-enable t)
  (lsp-modeline-diagnostics-enable t)
  (lsp-completion-provider :capf)
  (lsp-idle-delay 0.500))

(use-package lsp-ui
  :hook (lsp-mode . lsp-ui-mode)
  :custom
  (lsp-ui-doc-enable t)
  (lsp-ui-doc-show-with-cursor t)
  (lsp-ui-doc-show-with-mouse nil)
  (lsp-ui-doc-position 'at-point)
  (lsp-ui-doc-delay 0.5)
  (lsp-ui-sideline-enable t)
  (lsp-ui-sideline-show-diagnostics t)
  (lsp-ui-sideline-show-hover t)
  (lsp-ui-sideline-show-code-actions t))

Development Tools

Configure completion, snippets, and syntax checking.

(use-package company
  :hook (lsp-mode . company-mode)
  :custom
  (company-minimum-prefix-length 1)
  (company-idle-delay 0.0))

(use-package company-box
  :hook (company-mode . company-box-mode))

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

(use-package yasnippet-snippets
  :after yasnippet)

(use-package flycheck
  :init
  (global-flycheck-mode))

Version Control

Magit configuration for Git integration.

(use-package magit
  :bind ("C-M-;" . magit-status)
  :commands (magit-status magit-get-current-branch)
  :custom
  (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))

(use-package magit-todos
  :after magit
  :config
  (magit-todos-mode 1))

Terminal Support

Configure VTerm for terminal emulation.

(use-package vterm
  :commands vterm
  :custom
  (term-prompt-regexp "^[^#$%>\n]*[#$%>] *")
  (vterm-max-scrollback 10000))

(use-package multi-vterm
  :after vterm
  :config
  (add-hook 'vterm-mode-hook
            (lambda ()
              (setq-local evil-insert-state-cursor 'box)
              (evil-insert-state))))

Tree-sitter Configuration

Modern syntax highlighting and parsing.

(use-package treesit-auto
  :config
  (global-treesit-auto-mode))

(setq treesit-language-source-alist
      '((bash "https://github.com/tree-sitter/tree-sitter-bash")
        (cmake "https://github.com/uyha/tree-sitter-cmake")
        (css "https://github.com/tree-sitter/tree-sitter-css")
        (elisp "https://github.com/Wilfred/tree-sitter-elisp")
        (go "https://github.com/tree-sitter/tree-sitter-go")
        (html "https://github.com/tree-sitter/tree-sitter-html")
        (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "master" "src")
        (json "https://github.com/tree-sitter/tree-sitter-json")
        (python "https://github.com/tree-sitter/tree-sitter-python")
        (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src")
        (yaml "https://github.com/ikatyang/tree-sitter-yaml")))

;; Install tree-sitter languages
(defun efs/install-treesit-language (lang)
  "Install tree-sitter grammar for LANG if it's not already installed."
  (unless (treesit-language-available-p lang)
    (treesit-install-language-grammar lang)))

(dolist (lang '(bash cmake css elisp go html javascript json python typescript yaml))
  (efs/install-treesit-language lang))

;; Remap major modes to tree-sitter versions
(setq major-mode-remap-alist
      '((python-mode . python-ts-mode)
        (javascript-mode . js-ts-mode)
        (js-mode . js-ts-mode)
        (typescript-mode . typescript-ts-mode)
        (json-mode . json-ts-mode)
        (css-mode . css-ts-mode)
        (yaml-mode . yaml-ts-mode)
        (bash-mode . bash-ts-mode)
        (go-mode . go-ts-mode)))