;;; -*- lexical-binding: t; -*-
;;; Setup
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(require 'use-package)
(setq use-package-always-ensure t)
(use-package no-littering
:config
(no-littering-theme-backups)
(setq custom-file (no-littering-expand-etc-file-name "custom.el"))
(when (file-exists-p custom-file) (load custom-file)))
;;; Emacs
(use-package emacs
:preface
(defun flash-mode-line ()
"Briefly invert the mode line, as a visual replacement for the bell."
(invert-face 'mode-line)
(run-with-timer 0.1 nil #'invert-face 'mode-line))
:bind (("C-c r" . rgrep)
("C-c c" . calc)
("C-c q" . display-line-numbers-mode)
("C-x C-b" . ibuffer))
:custom
(gc-cons-threshold 100000000)
(visible-bell nil)
(ring-bell-function #'flash-mode-line)
(inhibit-startup-screen t)
(initial-major-mode 'fundamental-mode)
(initial-frame-alist '((fullscreen . maximized)))
(default-frame-alist '((fullscreen . maximized)))
(use-short-answers t)
(cursor-type 'bar)
(xterm-update-cursor t)
(indent-tabs-mode nil)
(tab-width 4)
(treesit-auto-install-grammar 'always)
(treesit-enabled-modes t)
:config
(add-function :after after-focus-change-function #'garbage-collect)
(set-face-attribute 'default nil :family "Fira Code" :height 120)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(menu-bar-mode -1)
(xterm-mouse-mode t)
(global-auto-revert-mode t)
(pixel-scroll-precision-mode t)
(mouse-shift-adjust-mode t)
(put 'narrow-to-region 'disabled nil))
;;; Theme
(use-package modus-themes
:custom
(modus-themes-bold-constructs t)
(modus-themes-italic-constructs t)
(modus-themes-common-palette-overrides
'((border-mode-line-active unspecified)
(border-mode-line-inactive unspecified)))
:config
(load-theme 'modus-vivendi :no-confirm))
;;; Packages
(use-package ace-window
:bind ("C-c w" . ace-window)
:custom (aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)))
(use-package aggressive-indent
:config (global-aggressive-indent-mode t))
(use-package apheleia
:config
(setf (alist-get 'python-mode apheleia-mode-alist) '(ruff-isort ruff))
(setf (alist-get 'python-ts-mode apheleia-mode-alist) '(ruff-isort ruff))
(apheleia-global-mode t))
(use-package avy
:bind ("C-c j" . avy-goto-char-timer))
(use-package cape
:init
(add-to-list 'completion-at-point-functions #'cape-dabbrev t)
(add-to-list 'completion-at-point-functions #'cape-keyword t)
(add-to-list 'completion-at-point-functions #'cape-file t)
(add-to-list 'completion-at-point-functions #'cape-dict t))
(use-package corfu
:custom
(corfu-auto t)
(corfu-quit-no-match 'separator)
(tab-always-indent 'complete)
(completion-cycle-threshold 5)
:init
(global-corfu-mode)
(corfu-popupinfo-mode))
(use-package deadgrep
:bind ("C-c s" . deadgrep))
(use-package editorconfig
:config (editorconfig-mode t))
(use-package eglot
:demand t
:bind (:map eglot-mode-map
("C-c l a" . eglot-code-actions)
("C-c l r" . eglot-rename)
("C-c l h" . eldoc)
("C-c l R" . eglot-reconnect))
:config
(add-to-list 'eglot-server-programs
'((c++-mode c++-ts-mode) . ("clangd" "--query-driver=/**/*")))
(add-to-list 'eglot-server-programs
'((python-mode python-ts-mode) . ("ty" "server"))))
(use-package exec-path-from-shell
:config
(add-to-list 'exec-path-from-shell-variables "LD_LIBRARY_PATH")
(add-to-list 'exec-path-from-shell-variables "CAML_LD_LIBRARY_PATH")
(exec-path-from-shell-initialize))
(use-package ghostel
:bind ("C-c t" . ghostel))
(use-package magit
:bind (("C-c g" . magit-status)
("C-c ?" . magit-blame))
:custom (smerge-command-prefix (kbd "C-c v")))
(use-package multiple-cursors
:bind (("C-c e" . mc/edit-lines)
("C->" . mc/mark-next-like-this)
("C-<" . mc/mark-previous-like-this)
("C-c C->" . mc/mark-all-like-this)))
(use-package neotree
:bind ("C-c f" . neotree-toggle))
(use-package prescient
:custom (prescient-filter-method '(literal prefix initialism))
:config (prescient-persist-mode t))
(use-package corfu-prescient
:after corfu
:config (corfu-prescient-mode t))
(use-package vertico-prescient
:after vertico
:config (vertico-prescient-mode t))
(use-package smartparens
:config
(require 'smartparens-config)
(smartparens-global-mode t))
(use-package vertico
:custom (vertico-resize t)
:init (vertico-mode))
(use-package vundo
:bind ("C-c u" . vundo)
:custom (vundo-compact-display t))
(use-package which-key
:config (which-key-mode))
(use-package windmove
:bind (("M-<up>" . windmove-up)
("M-<down>" . windmove-down)
("M-<left>" . windmove-left)
("M-<right>" . windmove-right)))
(use-package windsize
:config (windsize-default-keybindings))
;;; Languages
(use-package cc-mode
:mode ("\\.h\\'" . c++-mode)
:hook ((c++-mode c++-ts-mode) . eglot-ensure))
(use-package python
:hook ((python-mode python-ts-mode) . eglot-ensure))
(use-package rust-mode
:hook ((rust-mode rust-ts-mode) . eglot-ensure))
(use-package tex
:ensure auctex
:custom
(TeX-auto-save t)
(TeX-parse-self t)
(TeX-save-query nil))
;;; Other
(use-package pdf-tools
:init (pdf-loader-install))
(use-package markdown-ts-mode
:mode ("\\.md\\'" . markdown-ts-mode))
(use-package csv-mode)
(use-package protobuf-mode)
;; Conditional
(when (string= (system-name) "boxspren")
(when (file-exists-p "~/misc/conf/personal.el")
(load-file "~/misc/conf/personal.el")))
(when (string= (system-name) "boxspren")
(when (file-exists-p "~/misc/conf/work.el")
(load-file "~/misc/conf/work.el")))