;;; init.el --- Package bootstrapping. -*- lexical-binding: t; -*- ;; Packages are installed via Nix configuration, this file only ;; initialises the newly loaded packages. (require 'use-package) (require 'seq) (package-initialize) ;; Initialise all packages installed via Nix. ;; ;; TODO: Generate this section in Nix for all packages that do not ;; require special configuration. ;; ;; Packages providing generic functionality. ;; (use-package ace-window :bind (("C-x o" . ace-window)) :config (setq aw-keys '(?f ?j ?d ?k ?s ?l ?a) aw-scope 'frame)) (use-package auth-source-pass :config (auth-source-pass-enable)) (use-package avy :bind (("M-j" . avy-goto-char) ("M-p" . avy-pop-mark) ("M-g g" . avy-goto-line))) (use-package browse-kill-ring) (use-package company :hook ((prog-mode . company-mode)) :config (setq company-tooltip-align-annotations t)) (use-package counsel :after (ivy) :config (counsel-mode 1) :bind (("C-c r g" . counsel-rg))) (use-package dash) (use-package dash-functional) (use-package dottime :demand :after (notmuch telega) :config (dottime-display-mode t)) (use-package gruber-darker-theme) (use-package eglot :custom (eglot-autoshutdown t) (eglot-send-changes-idle-time 0.3)) (use-package ht) (use-package hydra) (use-package idle-highlight-mode :hook ((prog-mode . idle-highlight-mode))) (use-package ivy :config (ivy-mode 1) (setq enable-recursive-minibuffers t) (setq ivy-use-virtual-buffers t)) (use-package ivy-pass :after (ivy)) (use-package ivy-prescient :after (ivy prescient) :config (ivy-prescient-mode) ;; Fixes an issue with how regexes are passed to ripgrep from counsel, ;; see raxod502/prescient.el#43 (setf (alist-get 'counsel-rg ivy-re-builders-alist) #'ivy--regex-plus)) (use-package multiple-cursors) (use-package notmuch :bind (:map global-map ("s-g m" . notmuch) ("s-g M" . counsel-notmuch)) ;; g m -> gmail :config (setq notmuch-search-oldest-first nil) (setq notmuch-show-all-tags-list t) (setq notmuch-hello-tag-list-make-query "tag:unread")) (use-package paredit :hook ((lisp-mode . paredit-mode) (emacs-lisp-mode . paredit-mode))) (use-package pinentry :config (setq epa-pinentry-mode 'loopback) (pinentry-start)) (use-package prescient :after (ivy counsel) :config (prescient-persist-mode)) (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) (use-package rainbow-mode) (use-package s) (use-package string-edit) (use-package swiper :after (counsel ivy) :bind (("C-s" . swiper))) (use-package telephone-line) ;; configuration happens outside of use-package (use-package term-switcher) (use-package undo-tree :config (global-undo-tree-mode)) (use-package uuidgen) (use-package which-key :config (which-key-mode t)) ;; ;; Applications in emacs ;; (use-package magit :bind ("C-c g" . magit-status) :config (setq magit-repository-directories '(("/home/tazjin/projects" . 2) ("/home/tazjin" . 1)))) (use-package org-journal ;; Always use my own key to encrypt files. There seems to be no ;; global way to set this, as `epa-file-encrypt-to' only has an ;; effect as a file-local variable (?!) :hook ((org-journal-mode . (lambda () (setq-local epa-file-encrypt-to "DCF34CFAC1AC44B87E26333136EE34814F6D294A")))) :config (setq org-journal-dir "/ssh:camden.tazj.in:/home/tazjin/journal" org-journal-encrypt-journal t org-journal-file-type 'weekly org-journal-date-format "%A, %Y-%m-%d" org-journal-file-format "%Y%m%d-weekly" ;; Saturday, because reasons. org-journal-start-on-weekday 6) ;; org-journal doesn't actually enter its mode automatically if ;; encryption is used (I'm not sure why), so this teaches Emacs to ;; recognise the files. (add-to-list 'auto-mode-alist '("[0-9]-weekly\\.gpg\\'" . org-journal-mode))) (use-package org-ql) (use-package password-store) (use-package pg) (use-package restclient) (use-package vterm :config (progn (setq vterm-shell "fish") (setq vterm-exit-functions (lambda (&rest _) (kill-buffer (current-buffer)))) (setq vterm-set-title-functions (lambda (title) (rename-buffer (generate-new-buffer-name (format "vterm<%s>" (s-trim-left (s-chop-prefix "fish" title))))))))) ;; ;; Packages providing language-specific functionality ;; (use-package cargo :hook ((rust-mode . cargo-minor-mode) (cargo-process-mode . visual-line-mode)) :bind (:map cargo-minor-mode-map ("C-c C-c C-l" . ignore))) (use-package dockerfile-mode) (use-package erlang :hook ((erlang-mode . (lambda () ;; Don't indent after '>' while I'm writing (local-set-key ">" 'self-insert-command))))) (use-package f) (use-package geiser) (use-package go-mode :bind (:map go-mode-map ("C-c C-r" . recompile)) :hook ((go-mode . (lambda () (setq tab-width 2) (setq-local compile-command (concat "go build " buffer-file-name)))))) (use-package haskell-mode) (use-package ielm :hook ((inferior-emacs-lisp-mode . (lambda () (paredit-mode) (rainbow-delimiters-mode-enable) (company-mode))))) (use-package jq-mode :config (add-to-list 'auto-mode-alist '("\\.jq\\'" . jq-mode))) (use-package kotlin-mode :hook ((kotlin-mode . (lambda () (setq indent-line-function #'indent-relative))))) (use-package lsp-mode) (use-package markdown-mode :config (add-to-list 'auto-mode-alist '("\\.txt\\'" . markdown-mode)) (add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode)) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))) (use-package markdown-toc) (use-package nix-mode :hook ((nix-mode . (lambda () (setq indent-line-function #'nix-indent-line))))) (use-package nix-util) (use-package nginx-mode) (use-package rust-mode) (use-package sly :hook ((sly-mrepl-mode . (lambda () (paredit-mode) (rainbow-delimiters-mode-enable) (company-mode)))) :config (setq common-lisp-hyperspec-root "file:///home/tazjin/docs/lisp/")) (use-package telega :bind (:map global-map ("s-t" . telega)) :config (telega-mode-line-mode 1)) (use-package terraform-mode) (use-package toml-mode) (use-package web-mode) (use-package yaml-mode) (defgroup tazjin nil "Settings related to my configuration") (defcustom depot-path "/depot" "Local path to the depot checkout" :group 'tazjin) ;; Configuration changes in `customize` can not actually be persisted ;; to the customise file that Emacs is currently using (since it comes ;; from the Nix store). ;; ;; The way this will work for now is that Emacs will *write* ;; configuration to the file tracked in my repository, while not ;; actually *reading* it from there (unless Emacs is rebuilt). (setq custom-file (expand-file-name "~/depot/tools/emacs/config/custom.el")) (load-library "custom") (defvar home-dir (expand-file-name "~")) ;; Seed RNG (random t) ;; Load all other Emacs configuration. These configurations are ;; added to `load-path' by Nix. (mapc 'require '(desktop mail-setup look-and-feel functions settings modes bindings eshell-setup)) (telephone-line-setup) (ace-window-display-mode) ;; If a local configuration library exists, it should be loaded. ;; ;; This can be provided by calling my Emacs derivation with ;; `withLocalConfig'. (if-let (local-file (locate-library "local")) (load local-file)) (provide 'init)