nixconfig/emacs/init.el

895 lines
27 KiB
EmacsLisp
Raw Normal View History

2023-11-15 16:09:47 +00:00
;;; init.el --- Description -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2023 Daniel Ziltener
;;
;; Author: Daniel Ziltener <dziltener@lyrion.ch>
;; Maintainer: Daniel Ziltener <dziltener@lyrion.ch>
;; Created: November 13, 2023
;; Modified: November 13, 2023
;; Version: 0.0.1
2023-11-16 10:30:36 +00:00
;; Keywords: abbrev bib c calendar comm convenience data docs
;; emulations extensions faces files frames games hardware help
;; hypermedia i18n internal languages lisp local maint mail matching
;; mouse multimedia news outlines processes terminals tex tools unix
;; vc wp
2023-12-13 12:35:06 +00:00
;; Homepage: https://gitea.lyrion.ch/zilti/guixconfig
;; Package-Requires: ((emacs "29.1"))
2023-11-15 16:09:47 +00:00
;;
;; This file is not part of GNU Emacs.
;;
;;; Commentary:
;;
;; Description
;;
;;; Code:
2023-11-24 17:02:30 +00:00
;;;; Requirements
;; Since I am using `cl-defun` in this init file, I need to require
;; `cl-macs`.
2023-11-20 00:59:52 +00:00
(require 'cl-macs)
2023-11-15 16:09:47 +00:00
;;;; Early Variables
2023-12-13 11:46:11 +00:00
(setq custom-file "~/.config/emacs/custom.el")
2023-11-15 16:09:47 +00:00
(when (file-exists-p custom-file)
(load custom-file))
2023-12-13 11:46:11 +00:00
(defvar init-dir (file-name-directory (or load-file-name (buffer-file-name))))
2023-11-15 16:09:47 +00:00
;;;; Personal Information Setup
(setq user-full-name "Daniel Ziltener"
user-mail-address "dziltener@lyrion.ch")
2023-11-24 17:02:30 +00:00
;; I use `pass` as password storage.
2023-11-15 16:09:47 +00:00
(auth-source-pass-enable)
;;;; Straight.el
2023-12-14 11:30:17 +00:00
;; (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))
;; (setq straight-use-package-by-default t)
;;;; Elpaca
;;;;; Installation
(defvar elpaca-installer-version 0.6)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
:ref nil
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
:build (:not elpaca--activate-package)))
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
(build (expand-file-name "elpaca/" elpaca-builds-directory))
(order (cdr elpaca-order))
(default-directory repo))
(add-to-list 'load-path (if (file-exists-p build) build repo))
(unless (file-exists-p repo)
(make-directory repo t)
(when (< emacs-major-version 28) (require 'subr-x))
(condition-case-unless-debug err
(if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
((zerop (call-process "git" nil buffer t "clone"
(plist-get order :repo) repo)))
((zerop (call-process "git" nil buffer t "checkout"
(or (plist-get order :ref) "--"))))
(emacs (concat invocation-directory invocation-name))
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
((require 'elpaca))
((elpaca-generate-autoloads "elpaca" repo)))
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
(error "%s" (with-current-buffer buffer (buffer-string))))
((error) (warn "%s" err) (delete-directory repo 'recursive))))
(unless (require 'elpaca-autoloads nil t)
(require 'elpaca)
(elpaca-generate-autoloads "elpaca" repo)
(load "./elpaca-autoloads")))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))
;;;;; use-package integration
(elpaca elpaca-use-package
(elpaca-use-package-mode)
(setq elpaca-use-package-by-default t))
(elpaca-wait)
2023-11-15 16:09:47 +00:00
;;;; Package Management Configuration
;; See: https://github.com/radian-software/el-patch
(use-package el-patch)
2023-12-13 11:46:11 +00:00
;;;;; Guix Management
(use-package guix)
2023-11-17 11:20:24 +00:00
;;;; Helper Functions
2023-11-24 17:02:30 +00:00
(cl-defun conditional-keybind
(filter-fn target-fn
&optional (fail-fn #'self-insert-command))
"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."
2023-11-17 11:20:24 +00:00
(lambda (_prefix)
(interactive "P")
(if (funcall filter-fn)
(call-interactively target-fn)
2023-11-20 00:59:52 +00:00
(call-interactively fail-fn))))
2023-11-17 11:20:24 +00:00
2023-11-15 16:09:47 +00:00
;;;; Emacs
(use-package emacs
2023-12-14 11:30:17 +00:00
:elpaca nil
2023-11-22 20:41:50 +00:00
:delight (eldoc-mode " 󰙎")
2023-11-15 16:09:47 +00:00
:custom
(completion-cycle-threshold 10)
2023-11-22 22:27:09 +00:00
(display-time-mode t)
2023-11-16 10:30:36 +00:00
(enable-recursive-minibuffers t)
2023-11-16 11:09:43 +00:00
(enable-remote-dir-locals t)
2023-11-24 17:02:30 +00:00
(fill-column 100)
2023-11-15 16:09:47 +00:00
(global-hl-line-mode t)
2023-11-22 22:27:09 +00:00
(indent-tabs-mode nil)
2023-11-15 16:09:47 +00:00
(menu-bar-mode nil)
2023-11-22 22:27:09 +00:00
(minibuffer-prompt-properties (read-only t cursor-intangible t face minibuffer-prompt))
(read-extended-command-predicate #'command-completion-default-include-p)
(recentf-mode t)
2023-11-15 16:09:47 +00:00
(scroll-bar-mode nil)
2023-11-22 22:27:09 +00:00
(tab-always-indent 'complete)
2023-11-16 10:30:36 +00:00
(tool-bar-mode nil)
2023-11-22 22:27:09 +00:00
:custom-face
2023-12-13 11:46:11 +00:00
;;(default ((t (:weight bold :height 113 :width normal :family "VictorMono Nerd Font"))))
(default ((t (:weight regular :height 105 :width normal :family "MonaspiceXe Nerd Font Mono"))))
2023-11-16 10:30:36 +00:00
:hook
2023-11-16 11:09:43 +00:00
(minibuffer-setup . cursor-intangible-mode)
:config
2023-11-24 17:02:30 +00:00
(advice-add 'risky-local-variable-p :override #'ignore)
2023-12-13 11:46:11 +00:00
(global-display-fill-column-indicator-mode t)
(pixel-scroll-precision-mode 1))
2023-11-15 16:09:47 +00:00
;;;; Org Mode
(use-package org
2023-12-14 14:15:59 +00:00
:elpaca (:repo "https://git.savannah.gnu.org/git/emacs/org-mode.git" :branch "emacs-sync")
2023-11-15 16:09:47 +00:00
:ensure t
2023-12-13 11:46:11 +00:00
:custom
(org-babel-load-languages '((emacs-lisp . t)
(scheme . t)))
2023-11-15 16:09:47 +00:00
:hook
2023-11-22 23:09:24 +00:00
(org-mode . org-indent-mode)
2023-11-15 16:09:47 +00:00
(org-src-mode . hack-local-variables)
2023-12-13 11:46:11 +00:00
(org-mode . visual-line-mode)
2023-11-15 16:09:47 +00:00
:config
(setq org-directory "~/org")
(add-to-list 'org-modules 'collector))
(use-package org-roam
:ensure t
:custom
(org-roam-directory "~/org/roam")
:config
2023-12-13 11:46:11 +00:00
(org-roam-db-autosync-mode))
2023-11-15 16:09:47 +00:00
2023-11-22 23:09:24 +00:00
(use-package consult-notes
:config
(consult-notes-org-roam-mode t))
2023-11-22 22:27:09 +00:00
2023-11-15 16:09:47 +00:00
(use-package websocket
:ensure t
:after org-roam)
(use-package org-roam-ui
:ensure t
:after org-roam
:custom
(org-roam-ui-sync-theme t)
(org-roam-ui-follow t)
(org-roam-ui-update-on-save t)
(org-roam-ui-open-on-start t))
(use-package org-modern
:ensure t
:hook
((org-mode . org-modern-mode)
(org-agenda-finalize . org-modern-agenda)))
(use-package org-rainbow-tags
:hook
(org-mode . org-rainbow-tags-mode))
;;;; Design
(use-package color-theme-modern)
(use-package moe-theme)
(use-package catppuccin-theme
:custom
(catppuccin-flavor 'mocha)
(catppuccin-highlight-matches t)
(catppuccin-italic-comments t)
:custom-face
(font-lock-doc-face ((t (:inherit font-lock-comment-face
2023-11-17 02:22:38 +00:00
:foreground "#fab387"))))
2023-11-15 16:09:47 +00:00
:config
2023-11-22 22:27:09 +00:00
;;(load-theme 'catppuccin)
)
2023-11-15 16:09:47 +00:00
2023-12-13 11:46:11 +00:00
(use-package unicode-fonts
:ensure t
:config
(unicode-fonts-setup))
2023-11-15 16:09:47 +00:00
2023-12-13 11:46:11 +00:00
(use-package ligature
:config
(ligature-set-ligatures
't
'( ;; SS01
"==" "===" "=/=" "!=" "!==" "/=" "/==" "~~" "=~" "!~"
;; SS02
">=" "<="
;; SS03
"->" "<-" "=>" "<!--" "-->" "<~" "<~~" "~>" "~~>" "<~>"
;; SS04
"</" "/>" "</>" "/\\" "\\/"
;; SS05
"|>" "<|"
;; SS06
"##" "###"
;; SS07
"***" "/*" "*/" "/*/" "(*" "*)" "(*)"
;; SS08
".=" ".-" "..<"
;; CALT
"//" "///" "&&" "!!" "??" "?." "?:" "||" "::" ":::" ";;" ".." "..." "=!=" "#=" ":=" "=:" "=:="
":>" ">:" "<:" ":<" "..=" "..-"
))
(global-ligature-mode t))
2023-11-22 22:27:09 +00:00
2023-12-13 11:46:11 +00:00
(set-frame-parameter nil 'alpha-background 80)
(add-to-list 'default-frame-alist '(alpha-background . 80))
2023-11-22 20:41:50 +00:00
2023-11-22 22:27:09 +00:00
(use-package lambda-line
2023-12-14 11:30:17 +00:00
;;:straight (:type git :host github :repo "lambda-emacs/lambda-line")
:elpaca (:host github :repo "lambda-emacs/lambda-line")
2023-11-22 22:27:09 +00:00
:custom
(lambda-line-icon-time t) ;; requires ClockFace font (see below)
2023-11-24 17:02:30 +00:00
(lambda-line-clockface-update-fontset "ClockFaceRect") ;; set clock icon
2023-11-22 22:27:09 +00:00
(lambda-line-position 'bottom) ;; Set position of status-line
(lambda-line-abbrev t) ;; abbreviate major modes
(lambda-line-hspace " ") ;; add some cushion
(lambda-line-prefix t) ;; use a prefix symbol
(lambda-line-prefix-padding nil) ;; no extra space for prefix
(lambda-line-status-invert nil) ;; no invert colors
(lambda-line-gui-ro-symbol "") ;; symbols
(lambda-line-gui-mod-symbol "")
2023-11-24 17:02:30 +00:00
(lambda-line-gui-rw-symbol "")
(lambda-line-vc-symbol "")
2023-11-22 22:27:09 +00:00
(lambda-line-space-top +.50) ;; padding on top and bottom of line
(lambda-line-space-bottom -.50)
(lambda-line-symbol-position 0.1) ;; adjust the vertical placement of symbol
:config
2023-11-24 17:02:30 +00:00
;; add evil indicator
(advice-add 'lambda-line-compose :around
(lambda (orig-fun status name primary tertiary secondary)
(funcall orig-fun
status
(concat name evil-mode-line-tag)
primary tertiary secondary)))
2023-11-22 22:27:09 +00:00
;; activate lambda-line
(lambda-line-mode)
2023-11-24 17:02:30 +00:00
(lambda-line-clockface-update-fontset "ClockFaceRect")
2023-11-22 22:27:09 +00:00
(customize-set-variable 'flymake-mode-line-counter-format '("" flymake-mode-line-error-counter flymake-mode-line-warning-counter flymake-mode-line-note-counter ""))
(customize-set-variable 'flymake-mode-line-format '(" " flymake-mode-line-exception flymake-mode-line-counters))
;; set divider line in footer
(when (eq lambda-line-position 'top)
(setq-default mode-line-format (list "%_"))
(setq mode-line-format (list "%_"))))
(use-package lambda-themes
2023-12-14 11:30:17 +00:00
;;:straight (:type git :host github :repo "lambda-emacs/lambda-themes")
:elpaca (:host github :repo "lambda-emacs/lambda-themes")
2023-11-22 22:27:09 +00:00
:custom
(lambda-themes-set-italic-comments t)
(lambda-themes-set-italic-keywords t)
(lambda-themes-set-variable-pitch t)
2023-11-22 20:41:50 +00:00
:config
2023-11-22 22:27:09 +00:00
;; load preferred theme
(load-theme 'lambda-dark))
2023-11-22 20:41:50 +00:00
2023-12-13 11:46:11 +00:00
(use-package visual-fill-column
:custom
(visual-fill-column-center-text t)
(visual-fill-column-enable-sensible-window-split t)
:hook visual-line-mode)
(use-package adaptive-wrap
:hook visual-fill-column)
2023-11-15 16:09:47 +00:00
;;;; Security
(use-package keychain-environment
:init
(keychain-refresh-environment))
(use-package pass)
(use-package password-store)
(use-package password-store-otp)
;;;; Evil Mode
(use-package evil
;; :after evil-leader
:ensure t
:init
2023-11-24 17:02:30 +00:00
(setq evil-want-keybinding nil
evil-emacs-state-tag " 󰯸 "
evil-normal-state-tag " 󰰓 "
evil-visual-state-tag " 󰰬 "
evil-insert-state-tag " 󰰅 "
evil-motion-state-tag " 󰬔 "
evil-operator-state-tag " 󰰕 ")
2023-11-15 16:09:47 +00:00
:config
(evil-set-leader 'normal (kbd "<SPC>"))
(evil-set-leader 'normal (kbd "z") t)
(evil-mode 1)
:bind
(:map evil-normal-state-map
2023-11-17 02:22:38 +00:00
("<leader>f" . 'find-file)
("<leader>k" . 'kill-buffer)))
2023-11-15 16:09:47 +00:00
(use-package evil-collection
:after evil
:ensure t
2023-11-22 20:41:50 +00:00
:delight evil-collection-unimpaired-mode
2023-11-15 16:09:47 +00:00
:custom
(evil-collection-outline-bind-tab-p 1)
:commands evil-collection-init
:init
(evil-collection-init))
;;;; Search, Completion, Execution
;;;;; Preliminary Packages
(use-package savehist
2023-12-14 11:30:17 +00:00
:elpaca nil
2023-11-15 16:09:47 +00:00
:init
(savehist-mode))
(use-package orderless
2023-11-16 10:30:36 +00:00
:after consult
2023-11-15 16:09:47 +00:00
:config
2023-11-16 11:52:31 +00:00
(with-eval-after-load 'eglot
(setq completion-category-defaults nil))
2023-11-23 22:45:40 +00:00
(setq completion-styles '(orderless basic)
2023-11-17 02:22:38 +00:00
completion-category-defaults nil
2023-11-23 22:45:40 +00:00
completion-category-overrides '((file (styles basic partial-completion)))))
2023-11-15 16:09:47 +00:00
2023-12-13 11:46:11 +00:00
(use-package embark-consult
:hook
2023-12-14 11:33:52 +00:00
(embark-collect-mode . consult-preview-at-point-mode)
2023-12-13 11:46:11 +00:00
:config
(require 'consult-flymake)
(require 'consult-xref)
2023-11-15 16:09:47 +00:00
:bind
2023-11-17 02:22:38 +00:00
(:map evil-normal-state-map
("<leader><SPC>" . 'consult-find)
("<leader>gs" . 'consult-eglot-symbols)
("<leader>b" . 'consult-buffer)
("<leader>gb" . 'consult-project-buffer)
("<leader>g/" . 'consult-git-grep)
("<leader>/" . 'consult-grep)
2023-12-14 14:15:59 +00:00
("/" . 'consult-line))
("C-<SPC>" . 'embark-act)
("C-M-<return>" . 'embark-bindings))
2023-11-15 16:09:47 +00:00
2023-11-21 15:54:41 +00:00
(use-package wgrep
:config
(setq wgrep-auto-save-buffer t))
2023-11-15 16:09:47 +00:00
(use-package vertico
:commands
vertico-mode
:init
(vertico-mode))
(use-package marginalia
:commands
marginalia-mode
:init
(marginalia-mode))
(use-package nerd-icons-completion
:after marginalia
:commands
nerd-icons-completion-mode
:hook
(marginalia-mode-hook . nerd-icons-completion-marginalia-setup)
:init
(nerd-icons-completion-mode))
(use-package which-key
:commands
which-key-setup-minibuffer
:init
(which-key-setup-minibuffer))
;;;;; Code Completion
(use-package cape
2023-12-13 11:46:11 +00:00
:preface
(defun my/capf ()
(setq completion-at-point-functions
(list (cape-capf-super
#'tempel-complete
#'cape-dabbrev
#'cape-file
#'cape-dict
#'cape-line
#'cape-emoji
#'cape-keyword))))
2023-11-15 16:09:47 +00:00
:config
2023-12-13 11:46:11 +00:00
(advice-add 'eglot-completion-at-point :around #'cape-wrap-buster)
:hook
(org-mode . my/capf)
(prog-mode . my/capf))
2023-11-15 16:09:47 +00:00
(defun my/corfu-combined-sort (candidates)
"Sort CANDIDATES using both display-sort-function and corfu-sort-function."
(let ((candidates
(let ((display-sort-func (corfu--metadata-get 'display-sort-function)))
(if display-sort-func
(funcall display-sort-func candidates)
candidates))))
(if corfu-sort-function
(funcall corfu-sort-function candidates)
candidates)))
(use-package corfu
:custom
(corfu-cycle t)
(corfu-preselect 'prompt)
(corfu-auto t)
(corfu-scroll-margin 5)
(corfu-quit-no-match 'separator)
(evil-collection-corfu-key-themes '(tab-n-go))
2023-12-13 11:46:11 +00:00
(corfu-popupinfo-delay '(0.1 . 0.5))
2023-11-15 16:09:47 +00:00
:config
(setq corfu-sort-override-function #'my/corfu-combined-sort)
2023-12-13 11:46:11 +00:00
(add-to-list 'savehist-additional-variables 'corfu-history)
2023-11-15 16:09:47 +00:00
:commands
global-corfu-mode
:init
2023-12-13 11:46:11 +00:00
(global-corfu-mode)
(corfu-popupinfo-mode 1)
(corfu-history-mode 1))
2023-11-15 16:09:47 +00:00
(use-package nerd-icons-corfu
:after corfu
:init
(add-to-list 'corfu-margin-formatters 'nerd-icons-corfu-formatter))
(use-package corfu-terminal
2023-11-16 10:30:36 +00:00
:if (not (display-graphic-p))
2023-11-15 16:09:47 +00:00
:after corfu
2023-11-24 17:02:30 +00:00
:hook
global-corfu-mode)
2023-11-15 16:09:47 +00:00
(use-package tempel)
2023-11-23 09:42:52 +00:00
(use-package xref-union
:hook
cider-connected)
2023-11-22 14:32:58 +00:00
2023-11-15 16:09:47 +00:00
;;;; Basic Navigation
(use-package goto-chg
:bind
(:map evil-normal-state-map
2023-11-17 02:22:38 +00:00
("g," . 'goto-last-change)
("g;" . 'goto-last-change-reverse)))
2023-11-15 16:09:47 +00:00
2023-11-21 11:59:44 +00:00
(use-package evil-snipe
2023-11-22 20:41:50 +00:00
:delight (evil-snipe-local-mode " 󰓾 ")
2023-11-21 11:59:44 +00:00
:custom
(evil-snipe-scope 'whole-visible)
(evil-snipe-repeat-scope 'whole-buffer)
(evil-snipe-spillover-scope 'whole-buffer)
2023-11-24 17:02:30 +00:00
(evil-snipe-tab-increment t)
2023-11-21 11:59:44 +00:00
:hook
evil-mode
(evil-mode . evil-snipe-override-mode)
2023-12-14 14:15:59 +00:00
(evil-mode . evil-snipe-mode)
2023-11-21 11:59:44 +00:00
(magit-mode . turn-off-evil-snipe-override-mode)
2023-11-21 13:10:12 +00:00
;; See https://github.com/hlissner/evil-snipe/issues/95
;; :config
;; (evilem-define "gs" 'evil-snipe-repeat
;; :bind ((evil-snipe-scope 'buffer)
;; (evil-snipe-enable-highlight)
;; (evil-snipe-enable-incremental-highlight)))
)
2023-11-21 11:59:44 +00:00
(use-package evil-easymotion
:config
(evilem-default-keybindings "<leader>"))
2023-11-15 16:09:47 +00:00
;;;; Lisp Navigation and Editing
2023-11-19 23:29:24 +00:00
;;;;; Helper Functions
(defun cc/move-sexp-backward ()
"Move balanced expression (sexp) to the right of point backward one sexp.
Point must be at the beginning of balanced expression (sexp)."
(interactive)
(transpose-sexps 1)
(forward-sexp -2))
(defun cc/move-sexp-forward ()
"Move balanced expression (sexp) to the right of point forward one sexp.
Point must be at the beginning of balanced expression (sexp)."
(interactive)
(forward-sexp 1)
(transpose-sexps 1)
(forward-sexp -1))
2023-12-13 15:29:25 +00:00
(defvar last-sexp nil)
(defun cc/clone-sexp ()
"Clone the sexp right after the cursor."
(interactive)
(call-interactively #'mark-sexp)
(call-interactively #'kill-ring-save)
(call-interactively #'evil-paste-before)
(call-interactively #'forward-char)
(call-interactively #'paredit-newline))
2023-11-20 00:59:52 +00:00
(defun looking-at-opening-paren ()
(looking-at (rx (or "(" "{" "["))))
(defun being-past-closing-paren ()
2023-11-21 09:16:02 +00:00
(looking-back (rx (or ")" "}" "]"))))
2023-11-20 00:59:52 +00:00
2023-11-15 16:09:47 +00:00
;;;;; Basic
2023-12-14 11:30:17 +00:00
(use-package symex
:custom
(symex-modal-backend 'evil)
:config
(symex-initialize)
:bind
(:map evil-insert-state-map
("C-s" . #'symex-mode-interface)))
2023-12-13 15:29:25 +00:00
(use-package paredit
2023-11-15 16:09:47 +00:00
:hook
2023-12-13 15:29:25 +00:00
clojure-mode
2023-11-19 23:29:24 +00:00
emacs-lisp-mode
scheme-mode
2023-11-15 16:09:47 +00:00
:config
2023-12-13 15:29:25 +00:00
(evil-define-key 'insert paredit-mode-map
2023-11-20 00:59:52 +00:00
(kbd "r") (conditional-keybind #'looking-at-opening-paren
2023-12-13 15:29:25 +00:00
#'paredit-raise-sexp)
(kbd "w") (conditional-keybind #'looking-at-opening-paren
2023-11-19 23:29:24 +00:00
#'cc/move-sexp-backward)
2023-11-20 00:59:52 +00:00
(kbd "s") (conditional-keybind #'looking-at-opening-paren
2023-11-19 23:29:24 +00:00
#'cc/move-sexp-forward)
2023-12-13 15:29:25 +00:00
(kbd "c") (conditional-keybind #'looking-at-opening-paren
#'cc/clone-sexp)))
;; (use-package smartparens
;; :delight (smartparens-mode " 󰅲 ")
;; :hook
;; (smartparens-mode . show-smartparens-mode)
;; (smartparens-mode . smartparens-strict-mode)
;; clojure-ts-mode
;; emacs-lisp-mode
;; scheme-mode
;; :custom
;; (sp-undo-pairs-separately t)
;; :config
;; (add-to-list 'sp-clojure-modes 'clojure-ts-mode)
;; (add-to-list 'sp-clojure-modes 'clojurec-ts-mode)
;; (add-to-list 'sp-clojure-modes 'clojurescript-ts-mode)
;; (add-to-list 'sp-lisp-modes 'clojure-ts-mode)
;; (add-to-list 'sp-lisp-modes 'clojurec-ts-mode)
;; (add-to-list 'sp-lisp-modes 'clojurescript-ts-mode)
;; ;; TODO: Remove the following three lines once merge request got accepted
;; (load-file (concat init-dir "lib/smartparens-clojure.el"))
;; (load-file (concat init-dir "lib/smartparens-emacs-lisp.el"))
;; (load-file (concat init-dir "lib/smartparens-scheme.el"))
;; (require 'smartparens-clojure)
;; (require 'smartparens-emacs-lisp)
;; (require 'smartparens-scheme)
;; (evil-define-key 'insert smartparens-mode-map
;; (kbd "r") (conditional-keybind #'looking-at-opening-paren
;; #'sp-raise-sexp)
;; (kbd "w") (conditional-keybind #'looking-at-opening-paren
;; #'cc/move-sexp-backward)
;; (kbd "s") (conditional-keybind #'looking-at-opening-paren
;; #'cc/move-sexp-forward)
;; (kbd "c") (conditional-keybind #'looking-at-opening-paren
;; #'sp-clone-sexp)
;; (kbd "m") (conditional-keybind #'looking-at-opening-paren
;; #'sp-mark-sexp)
;; (kbd "DEL") (conditional-keybind #'being-past-closing-paren
;; #'sp-backward-delete-sexp
;; #'evil-delete-backward-char-and-join)
;; (kbd ">") (conditional-keybind #'being-past-closing-paren
;; (lambda (prefix)
;; (interactive "P")
;; (call-interactively #'backward-char)
;; (call-interactively #'sp-forward-slurp-sexp)
;; (call-interactively #'sp-forward-sexp)
;; (call-interactively #'forward-char)))
;; (kbd "<") (conditional-keybind #'being-past-closing-paren
;; (lambda (prefix)
;; (interactive "P")
;; (call-interactively #'backward-char)
;; (call-interactively #'sp-forward-barf-sexp)
;; (call-interactively #'forward-char)))))
;; (use-package evil-cleverparens
;; :after smartparens
;; :hook smartparens)
2023-11-15 16:09:47 +00:00
;;;;; Visual Aid
2023-11-17 02:22:38 +00:00
;; (use-package rainbow-delimiters
;; :hook
;; emacs-lisp-mode
;; scheme-mode)
2023-11-15 16:09:47 +00:00
;;;; Programming
(use-package editorconfig
2023-11-22 20:41:50 +00:00
:delight editorconfig-mode
2023-11-15 16:09:47 +00:00
:commands
editorconfig-mode
:init
(editorconfig-mode 1))
2023-11-22 20:41:50 +00:00
(use-package flymake
:delight '(:eval (cons "" (flymake--mode-line-counters))))
2023-11-16 10:30:36 +00:00
2023-11-15 16:09:47 +00:00
(use-package eglot
2023-12-13 11:46:11 +00:00
:preface
(defun my/eglot-capf ()
(setq completion-at-point-functions
(list (cape-capf-super
#'eglot-completion-at-point
#'tempel-complete
#'cape-dabbrev
#'cape-file
#'cape-dict
#'cape-line
#'cape-emoji
#'cape-keyword))))
2023-11-15 16:09:47 +00:00
:custom
(eglot-connect-timeout 90)
(eglot-autoshutdown t)
(eglot-report-progress t)
:config
(defun eglot-mode ()
(eglot-inlay-hints-mode +1)
(my/eglot-capf))
(setq-default eglot-workspace-configuration
2023-11-17 02:22:38 +00:00
'((clojure-lsp (maxCompletions . 300))))
2023-11-15 16:09:47 +00:00
(add-to-list 'eglot-server-programs
2023-12-13 15:29:25 +00:00
'((clojure-mode clojurec-mode clojurescript-mode)
2023-11-17 02:22:38 +00:00
"clojure-lsp"
:initializationOptions
(:preferences
(:includeInlayParameterNameHints
"all"
:includeInlayParameterNameHintsWhenArgumentMatchesName
t
:includeInlayFunctionParameterTypeHints
t
:includeInlayVariableTypeHints
t
:includeInlayVariableTypeHintsWhenTypeMatchesName
t
:includeInlayPRopertyDeclarationTypeHints
t
:includeInlayFunctionLikeReturnTypeHints
t
:includeInlayEnumMemberValueHints
t))))
2023-11-15 16:09:47 +00:00
:hook
2023-11-15 16:44:10 +00:00
(eglot-managed-mode . (lambda ()
2023-11-17 02:22:38 +00:00
(add-hook 'before-save-hook
(lambda ()
(call-interactively #'eglot-format-buffer))
nil 'local)))
2023-11-15 16:09:47 +00:00
(eglot-managed-mode . eglot-inlay-hints-mode)
2023-12-13 11:46:11 +00:00
(eglot-managed-mode . my/eglot-capf))
2023-11-15 16:09:47 +00:00
(use-package consult-eglot
:after (consult eglot))
(use-package tree-sitter
:ensure t)
;;;;; Clojure
2023-12-14 11:30:17 +00:00
(use-package clojure-ts-mode
:delight ""
:after tree-sitter
:config
(require 'sesman)
(sesman-install-menu clojure-mode-map)
:hook
((clojure-ts-mode . eglot-ensure)
(clojure-ts-mode . (lambda ()
(setq-local sesman-system 'CIDER)))
(clojure-ts-mode . (lambda ()
(sesman-install-menu clojure-mode-map)))
(clojurec-ts-mode . (lambda ()
(sesman-install-menu clojurec-mode-map)))
(clojurescript-ts-mode . (lambda ()
(sesman-install-menu clojurescript-mode-map))))
:mode
("\\.clj\\'" . #'clojure-ts-mode)
("\\.cljc\\'" . #'clojurec-ts-mode)
("\\.cljs\\'" . #'clojurescript-ts-mode)
:init
(add-to-list 'tree-sitter-major-mode-language-alist
'(clojure-ts-mode . clojure))
(add-to-list 'tree-sitter-major-mode-language-alist
'(clojurec-ts-mode . clojure))
(add-to-list 'tree-sitter-major-mode-language-alist
'(clojurescript-ts-mode . clojure)))
2023-11-15 16:09:47 +00:00
(use-package cider
2023-12-14 14:15:59 +00:00
:elpaca (:host github :repo "clojure-emacs/cider" :tag "v1.12.0")
2023-11-22 20:41:50 +00:00
:delight (cider-mode '(:eval (concat "  [" (cider--modeline-info) "]")))
2023-11-15 16:09:47 +00:00
:config
(evil-define-key 'insert 'cider-mode-map
"C-x C-e" #'cider-eval-last-sexp)
(evil-define-key 'normal 'cider-mode-map
(kbd "<localleader>ce") #'cider-eval-sexp-at-point))
2023-12-13 11:46:11 +00:00
;;;;; Scheme
(use-package geiser
:preface
(defun my/geiser-capf ()
(setq completion-at-point-functions
(append geiser-capf--capfs
(list (cape-capf-super
#'tempel-complete
#'cape-dabbrev
#'cape-file
#'cape-dict
#'cape-line
#'cape-emoji
#'cape-keyword)))))
:custom
(geiser-chicken-match-limit 200)
:config
(defalias 'run-geiser 'geiser)
:hook
(geiser-mode . my/geiser-capf))
(use-package paren-face
:hook
scheme-mode
2023-12-14 14:15:59 +00:00
emacs-lisp-mode
clojure-ts-mode)
2023-12-13 11:46:11 +00:00
(use-package highlight-parentheses
:hook prog-mode)
;;;;;; Chicken Scheme
2023-11-24 21:54:52 +00:00
(use-package scheme
2023-12-14 11:30:17 +00:00
:elpaca nil
2023-11-24 21:54:52 +00:00
:config
2023-12-13 11:46:11 +00:00
(setq prettify-symbols-alist
'(("lambda" . "λ")))
2023-11-24 21:54:52 +00:00
:hook
(scheme-mode . eglot-ensure))
2023-11-15 16:09:47 +00:00
(defun flymake-chicken-init ()
2023-11-16 10:30:36 +00:00
(add-hook 'flymake-diagnostic-functions
2023-11-17 02:22:38 +00:00
#'flymake-chicken-backend nil t)
2023-11-15 16:09:47 +00:00
(flymake-mode))
2023-12-13 11:46:11 +00:00
(use-package geiser-chicken)
;;;;;; Guile
2023-12-02 23:30:51 +00:00
(use-package geiser-guile
:config
2023-12-02 08:59:40 +00:00
(when (executable-find "guix")
2023-12-02 23:30:51 +00:00
(add-to-list 'geiser-guile-load-path
(expand-file-name "~/.config/guix/current/share/guile/site/3.0"))))
2023-11-15 16:09:47 +00:00
;; (use-package flymake-chicken
;; :hook
;; ((scheme-mode . flymake-chicken-init)
;; (scheme-mode . flymake-mode))
;; :custom
;; (flycheck-global-modes '(not scheme-mode))
;; :config
;; (add-hook 'flymake-diagnostic-functions #'flymake-chicken-backend nil t))
;;;; Other Languages
2023-11-24 17:02:30 +00:00
(use-package zig-mode
:hook
(zig-mode . eglot-ensure)
:mode ("\\.zig\\'" . zig-mode))
2023-11-15 16:09:47 +00:00
;; (use-package lsp-tailwindcss
;; :init
;; (setq lsp-tailwindcss-add-on-mode t
;; lsp-tailwindcss-experimental-class-regex ["\"([^\"]*)\""])
;; :config
;; (add-to-list 'lsp-tailwindcss-major-modes 'clojurescript-ts-mode)
;; (add-to-list 'lsp-tailwindcss-major-modes 'clojurec-ts-mode))
(use-package dhall-mode
:mode "\\.dhall\'"
:hook
((dhall-mode . lsp)))
;;;; Version Control
;;;;; Git
(use-package magit
:autoload
magit)
(use-package magit-todos
:after magit
:hook
(magit-mode . magit-todos-mode))
(use-package forge
:after magit
:config
2023-11-16 10:30:36 +00:00
(advice-add 'magit :after (lambda (&rest _args)
2023-11-17 02:22:38 +00:00
(call-interactively #'forge-pull))))
2023-11-15 16:09:47 +00:00
(use-package code-review
:after forge
:custom
(code-review-auth-login-marker 'forge))
(use-package git-gutter
2023-11-22 20:41:50 +00:00
:delight git-gutter-mode
2023-11-15 16:09:47 +00:00
:hook prog-mode)
;;;; LaTeX
;; https://github.com/politza/pdf-tools/#known-problems
2023-11-16 10:30:36 +00:00
(add-hook 'TeX-after-compilation-finished-functions
2023-11-17 02:22:38 +00:00
#'TeX-revert-document-buffer)
2023-11-15 16:09:47 +00:00
;;;; Communication
;;;;; IRC
2023-11-27 16:52:54 +00:00
(use-package rcirc
2023-12-14 11:30:17 +00:00
:elpaca nil
2023-11-15 16:09:47 +00:00
:ensure t
2023-12-14 11:30:17 +00:00
:after password-store
2023-11-15 16:09:47 +00:00
:custom
2023-11-27 16:52:54 +00:00
(rcirc-server-alist
`(("liberachat.irc.lyrion.ch"
:server-alias "irc.libera.chat"
2023-11-27 10:24:47 +00:00
:port 6697
:nick "zilti"
2023-11-27 16:52:54 +00:00
:full-name "Daniel Ziltener"
:user-name "zilti/irc.libera.chat"
:password ,(password-store-get "Privat/Soju")
:encryption tls
:channels ("#chicken")))
`(("oftc.irc.lyrion.ch"
:server-alias "irc.oftc.net"
2023-11-17 02:22:38 +00:00
:port 6697
:nick "zilti"
2023-11-27 16:52:54 +00:00
:full-name "Daniel Ziltener"
:user-name "zilti/irc.oftc.net"
:password ,(password-store-get "Privat/Soju")
:encryption tls
:channels ()))))
2023-11-15 16:09:47 +00:00
2023-12-13 11:46:11 +00:00
;;;; Wrapping Up
(use-package envrc
:config
(envrc-global-mode))
2023-11-15 16:09:47 +00:00
(provide 'init)
;;; init.el ends here