540 lines
15 KiB
EmacsLisp
540 lines
15 KiB
EmacsLisp
(add-hook 'emacs-startup-hook
|
|
(lambda ()
|
|
(message "tobmacs loaded in %s."
|
|
(emacs-init-time))))
|
|
|
|
(set-default-coding-systems 'utf-8)
|
|
(customize-set-variable 'visible-bell 1)
|
|
(customize-set-variable 'large-file-warning-threshold 100000000)
|
|
|
|
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
|
|
(load custom-file 'noerror)
|
|
|
|
;; (add-to-list 'native-comp-eln-load-path (expand-file-name "eln-cache/" user-emacs-directory))
|
|
|
|
(setq package-archives
|
|
'(("elpa" . "https://elpa.gnu.org/packages/")
|
|
("elpa-devel" . "https://elpa.gnu.org/devel/")
|
|
("nongnu" . "https://elpa.nongnu.org/nongnu/")
|
|
("melpa" . "https://melpa.org/packages/")))
|
|
|
|
(setq package-archive-priorities
|
|
'(("elpa" . 2)
|
|
("nongnu" . 1)))
|
|
|
|
(package-initialize)
|
|
|
|
(unless (package-installed-p 'use-package)
|
|
(package-refresh-contents)
|
|
(package-install 'use-package))
|
|
|
|
(setq use-package-enable-imenu-support t)
|
|
(require 'use-package)
|
|
(setq use-package-always-ensure t)
|
|
(setq use-package-compute-statistics t)
|
|
|
|
(setq gc-cons-threshold (* 2 1000 1000))
|
|
|
|
(add-to-list 'load-path (expand-file-name "to/" user-emacs-directory))
|
|
(require 'utils)
|
|
|
|
;; -----------------------------------------------------------------
|
|
|
|
(use-package ace-window
|
|
:bind
|
|
("M-o" . ace-window))
|
|
|
|
(use-package avy
|
|
:bind
|
|
(("C-." . avy-goto-char-timer)
|
|
("C-:" . avy-goto-char)
|
|
("M-g f" . avy-goto-line)))
|
|
|
|
(use-package cape
|
|
:init
|
|
(add-to-list 'completion-at-point-functions #'cape-dabbrev)
|
|
(add-to-list 'completion-at-point-functions #'cape-file)
|
|
(add-to-list 'completion-at-point-functions #'cape-history))
|
|
|
|
(use-package chatgpt-shell
|
|
:config
|
|
(setq chatgpt-shell-openai-key
|
|
(lambda ()
|
|
(auth-source-pick-first-password :host "api.openai.com"))))
|
|
|
|
(use-package cider
|
|
:defer t)
|
|
|
|
(use-package clj-refactor
|
|
:hook clojure-mode)
|
|
|
|
(use-package clojure-mode
|
|
:hook (clojure-mode . (lambda ()
|
|
(unbind-key "C-:" clojure-mode-map)))
|
|
:config
|
|
(use-package flycheck-clj-kondo)
|
|
(require 'flycheck-clj-kondo))
|
|
|
|
(use-package consult
|
|
:bind
|
|
(("C-x b" . consult-buffer)
|
|
("C-x 4 b" . consult-buffer-other-window)
|
|
("C-x r b" . consult-bookmark)
|
|
("C-x p b" . consult-project-buffer)
|
|
("M-y" . consult-yank-pop)
|
|
("M-g g" . consult-goto-line)
|
|
("M-g M-g" . consult-outline)
|
|
("M-i" . consult-imenu)
|
|
("M-s l" . consult-line)
|
|
("M-s L" . consult-line-multi))
|
|
:hook
|
|
(completion-list-mode . consult-preview-at-point-mode))
|
|
|
|
(use-package copilot
|
|
:load-path "packages/copilot"
|
|
:bind ("M-C-<return>" . copilot-accept-completion)
|
|
:commands (copilot-login global-copilot-mode)
|
|
:config
|
|
(defun to/copilot-disable-predicate ()
|
|
(member major-mode '(shell-mode
|
|
eshell-mode
|
|
term-mode
|
|
vterm-mode
|
|
compilation-mode
|
|
debugger-mode
|
|
dired-mode-hook
|
|
compilation-mode-hook
|
|
minibuffer-mode-hook)))
|
|
|
|
(add-to-list 'copilot-disable-predicates #'to/copilot-disable-predicate))
|
|
|
|
(use-package corfu
|
|
:custom
|
|
(corfu-cycle t)
|
|
(corfu-preselect-first nil)
|
|
(corfu-auto t)
|
|
:init
|
|
(global-corfu-mode))
|
|
|
|
(use-package dash)
|
|
|
|
(use-package denote
|
|
:bind (("C-c n n" . denote)
|
|
("C-c n l" . denote-link)
|
|
("C-c n b" . denote-link-backlinks))
|
|
:config
|
|
(setq denote-directory (expand-file-name "~/TobCloud/org/notes"))
|
|
(defun to/denote-journal()
|
|
"Create an entry tagged 'journal' with the data as its title.
|
|
If a journal for the current day exists, visit it. If multiple
|
|
entries exist, prompt with completion for a choice between them.
|
|
Else create a new file."
|
|
(interactive)
|
|
(let* ((today (format-time-string "%A %e %B %Y"))
|
|
(string (denote-sluggify today))
|
|
(files (denote-directory-files-matching-regexp string)))
|
|
(cond
|
|
((> (length files) 1)
|
|
(find-file (completing-read "Select file: " files nil :require-match)))
|
|
(files
|
|
(find-file (car files)))
|
|
(t
|
|
(denote today '("journal")))))))
|
|
|
|
(use-package dired
|
|
:ensure nil
|
|
:init
|
|
(setq dired-dwim-target t
|
|
dired-hide-details-hide-symlink-targets nil
|
|
dired-auto-revert-buffer #'dired-directory-changed-p
|
|
dired-recursive-copies 'always
|
|
dired-recursive-deletes 'top
|
|
dired-kill-when-opening-new-dired-buffer t)
|
|
|
|
(use-package dired-preview
|
|
:hook dired-mode)
|
|
|
|
(add-hook 'dired-mode-hook #'dired-hide-details-mode)
|
|
(add-hook 'dired-mode-hook #'hl-line-mode))
|
|
|
|
(use-package dired-x
|
|
:ensure nil)
|
|
|
|
(use-package dockerfile-mode)
|
|
|
|
(use-package dumb-jump
|
|
:config
|
|
(add-hook 'xref-backend-functions #'dumb-jump-xref-activate)
|
|
(setq xref-show-definitions-function #'xref-show-definitions-completing-read))
|
|
|
|
(use-package ef-themes
|
|
:config
|
|
(setq ef-themes-headings
|
|
'((0 . (variable-pitch light 2.0))
|
|
(1 . (variable-pitch light 1.7))
|
|
(2 . (variable-pitch semibold 1.5))
|
|
(t . (variable-pitch 1.0))))
|
|
(setq ef-themes-mixed-fonts t
|
|
ef-themes-variable-pitch-ui t
|
|
ef-themes-region '(intense no-extend))
|
|
(mapc #'disable-theme custom-enabled-themes))
|
|
|
|
(use-package editorconfig)
|
|
|
|
(use-package eglot
|
|
:hook
|
|
(swift-mode . eglot-ensure)
|
|
:config
|
|
(add-to-list
|
|
'eglot-server-programs
|
|
'(swift-mode . ("/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/sourcekit-lsp"))))
|
|
|
|
(use-package emacs
|
|
:config
|
|
(global-auto-revert-mode)
|
|
(minibuffer-electric-default-mode)
|
|
(repeat-mode)
|
|
(fset 'yes-or-no-p 'y-or-n-p)
|
|
(delete-selection-mode)
|
|
|
|
(setq
|
|
auto-save-file-name-transforms `((".*" ,temporary-file-directory t))
|
|
backup-directory-alist `((".*" . ,temporary-file-directory))
|
|
coding-system-for-read 'utf-8
|
|
coding-system-for-write 'utf-8
|
|
create-lockfiles nil
|
|
default-process-coding-system '(utf-8-unix . utf-8-unix)
|
|
delete-by-moving-to-trash t
|
|
isearch-allow-motion t
|
|
locale-coding-system 'utf-8
|
|
next-line-add-newlines t
|
|
sentence-end-double-space nil
|
|
tab-bar-new-tab-choice "*scratch*"
|
|
tab-bar-show nil
|
|
user-full-name "Tobias Ostner"
|
|
user-mail-address "tobias.ostner@gmail.com"
|
|
undo-limit 6710886400 ;; 64mb
|
|
undo-strong-limit 100663296 ;; x 1.5 (96mb)
|
|
undo-outer-limit 1006632960 ;; x 10 (960mb)
|
|
truncate-string-ellipsis "..."
|
|
use-dialog-box nil
|
|
fast-but-imprecise-scrolling t
|
|
read-process-output-max (* 1024 1024)
|
|
auto-revert-check-vc-info t
|
|
ns-use-proxy-icon nil
|
|
frame-title-format nil
|
|
auto-window-vscroll nil
|
|
bookmark-fringe-mark nil)
|
|
|
|
(setq isearch-lazy-count t
|
|
lazy-count-prefix-format "(%s/%s) "
|
|
lazy-count-suffix-format nil
|
|
search-whitespace-regexp ".*?")
|
|
|
|
(setq-default indent-tabs-mode nil
|
|
bidi-paragraph-direction 'left-to-right
|
|
bidi-inhibit-bpa t)
|
|
|
|
(set-charset-priority 'unicode)
|
|
(set-terminal-coding-system 'utf-8)
|
|
(set-keyboard-coding-system 'utf-8)
|
|
(set-selection-coding-system 'utf-8)
|
|
(prefer-coding-system 'utf-8)
|
|
|
|
(require 'epg)
|
|
(setq epg-pinentry-mode 'loopback)
|
|
|
|
(when (fboundp 'mac-auto-operator-composition-mode)
|
|
(mac-auto-operator-composition-mode))
|
|
|
|
(when (memq window-system '(mac ns))
|
|
(setq mac-option-modifier 'none
|
|
mac-command-modifier 'meta
|
|
visible-bell nil
|
|
ring-bell-function 'flash-mode-line)
|
|
|
|
(defun flash-mode-line ()
|
|
(invert-face 'mode-line)
|
|
(run-with-timer 0.1 nil #'invert-face 'mode-line))
|
|
|
|
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
|
|
(add-to-list 'default-frame-alist '(ns-appearance . dark))
|
|
|
|
(use-package exec-path-from-shell
|
|
:config
|
|
(exec-path-from-shell-initialize)))
|
|
|
|
(add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p)
|
|
(add-hook 'package-menu-mode-hook #'hl-line-mode)
|
|
:custom
|
|
(global-auto-revert-non-file-buffers t)
|
|
(kill-do-not-save-duplicates t)
|
|
(fast-but-imprecise-scrolling t)
|
|
(scroll-conservatively 101)
|
|
(scroll-margin 0)
|
|
(scroll-preserve-screen-position t))
|
|
|
|
(use-package flycheck
|
|
:init
|
|
(global-flycheck-mode))
|
|
|
|
(use-package flycheck-swiftlint
|
|
:after flycheck
|
|
:config
|
|
(flycheck-swiftlint-setup))
|
|
|
|
(use-package fontaine
|
|
:config
|
|
(setq-default text-scale-remap-header-line t)
|
|
(setq fontaine-presets
|
|
'((regular)
|
|
(presentation
|
|
:default-weight semilight
|
|
:default-height 250)
|
|
(t
|
|
:default-family "Iosevka Comfy"
|
|
:default-weight regular
|
|
:default-height 130
|
|
:fixed-pitch-height 1.0
|
|
:fixed-pitch-serif-height 1.0
|
|
:variable-pitch-family "Iosevka Comfy Motion Duo"
|
|
:variable-pitch-height 1.0
|
|
:bold-weight bold
|
|
:italic-slant italic
|
|
:line-spacing 0.2)))
|
|
(add-hook 'kill-emacs-hook #'fontaine-store-latest-preset)
|
|
(dolist (hook '(modus-themes-after-load-theme-hook ef-themes-post-load-hook))
|
|
(add-hook hook #'fontaine-apply-current-preset))
|
|
(dolist (hook '(text-mode-hook help-mode-hook))
|
|
(add-hook hook (lambda ()
|
|
(unless (or (derived-mode-p 'mhtml-mode 'nxml-mode 'yaml-mode)
|
|
(member (buffer-name) '("*Colors*" "*Faces*" "*Quick Help*")))
|
|
(variable-pitch-mode)))))
|
|
(fontaine-set-preset (or (fontaine-restore-latest-preset) 'regular)))
|
|
|
|
(use-package git-gutter
|
|
:after ef-themes
|
|
:hook prog-mode
|
|
:config
|
|
(setq git-gutter:update-interval 0.02)
|
|
(ef-themes-with-colors
|
|
(set-face-foreground 'git-gutter:modified yellow-warmer)
|
|
(set-face-foreground 'git-gutter:added green-warmer)
|
|
(set-face-foreground 'git-gutter:deleted red-warmer)))
|
|
|
|
(use-package git-gutter-fringe
|
|
:config
|
|
(define-fringe-bitmap 'git-gutter-fr:added [224] nil nil '(center repeated))
|
|
(define-fringe-bitmap 'git-gutter-fr:modified [224] nil nil '(center repeated))
|
|
(define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240] nil nil 'bottom))
|
|
|
|
(use-package graphql-mode)
|
|
|
|
(use-package js2-mode
|
|
:custom
|
|
(js2-basic-offset 2)
|
|
(js-chain-indent t)
|
|
(js-indent-level 2))
|
|
|
|
(use-package json-mode)
|
|
|
|
(use-package magit
|
|
:defer t)
|
|
|
|
(use-package marginalia
|
|
:init
|
|
(marginalia-mode))
|
|
|
|
(use-package modus-themes
|
|
:config
|
|
(setq modus-themes-org-blocks 'tinted-background
|
|
modus-themes-bold-constructs t
|
|
modus-themes-italic-constructs t
|
|
modus-themes-completions '((t . (extrabold)))
|
|
modus-themes-to-toggle '(modus-operandi modus-vivendi)
|
|
modus-themes-mixed-fonts t
|
|
modus-themes-variable-pitch-ui nil
|
|
modus-themes-headings
|
|
'((0 . (variable-pitch light 2.0))
|
|
(1 . (variable-pitch light 1.7))
|
|
(2 . (variable-pitch semibold 1.5))
|
|
(t . (variable-pitch 1.0))))
|
|
(load-theme 'modus-vivendi :no-confirm))
|
|
|
|
(use-package moody
|
|
:config
|
|
(setq x-underline-at-descent-line t)
|
|
(moody-replace-mode-line-buffer-identification)
|
|
(moody-replace-vc-mode)
|
|
(moody-replace-eldoc-minibuffer-message-function)
|
|
|
|
(use-package minions
|
|
:config
|
|
(minions-mode)))
|
|
|
|
(use-package nerd-icons
|
|
:if window-system
|
|
:config
|
|
(use-package nerd-icons-dired
|
|
:hook dired-mode)
|
|
(use-package nerd-icons-ibuffer
|
|
:hook ibuffer-mode)
|
|
(use-package nerd-icons-completion
|
|
:config
|
|
(nerd-icons-completion-mode)))
|
|
|
|
(use-package ob-restclient
|
|
:after org
|
|
:config
|
|
(org-babel-do-load-languages
|
|
'org-babel-load-languages
|
|
(append org-babel-load-languages
|
|
'((restclient . t)))))
|
|
|
|
(use-package ob-swift
|
|
:after org
|
|
:config
|
|
(org-babel-do-load-languages
|
|
'org-babel-load-languages
|
|
(append org-babel-load-languages
|
|
'((swift . t)))))
|
|
|
|
(use-package ob-swiftui
|
|
:after org)
|
|
|
|
(use-package olivetti
|
|
:hook (org-mode markdown-mode)
|
|
:custom
|
|
(olivetti-body-width 90))
|
|
|
|
(use-package orderless
|
|
:custom
|
|
(completion-styles '(orderless basic))
|
|
(completion-category-overrides '((file (styles basic partial-completion)))))
|
|
|
|
(use-package org
|
|
:bind
|
|
(("C-c c" . 'org-capture)
|
|
("C-c a" . 'org-agenda))
|
|
:hook
|
|
(org-mode . visual-line-mode)
|
|
:config
|
|
(setq org-auto-align-tags nil
|
|
org-tags-column 0
|
|
org-special-ctrl-a/e t
|
|
org-pretty-entities t
|
|
org-hide-emphasis-markers t
|
|
org-startup-with-inline-images t
|
|
org-agenda-files '("~/TobCloud/org")
|
|
org-capture-templates
|
|
'(("t" "Todo" entry (file "~/TobCloud/org/inbox.org")
|
|
"* TODO %?\n %t\n %i\n %a"))
|
|
org-confirm-babel-evaluate nil
|
|
org-startup-indented t))
|
|
|
|
(use-package org-modern
|
|
:after org
|
|
:init
|
|
(global-org-modern-mode)
|
|
:config
|
|
(setq org-modern-table nil))
|
|
|
|
(use-package org-tempo
|
|
:ensure nil)
|
|
|
|
(use-package ox-gfm
|
|
:after org)
|
|
|
|
(use-package parinfer-rust-mode
|
|
:hook (lisp-mode emacs-lisp-mode clojure-mode)
|
|
:init
|
|
;; https://github.com/justinbarclay/parinfer-rust-mode/issues/43#issuecomment-1054303553
|
|
(setq parinfer-rust-auto-download t))
|
|
|
|
(use-package paredit
|
|
:disabled t
|
|
:hook ((lisp-mode emacs-lisp-mode clojure-mode) . paredit-mode)
|
|
:config
|
|
;; https://stackoverflow.com/a/60672602
|
|
(paredit-do-commands (spec keys _fn _examples) nil
|
|
(dolist (key keys)
|
|
(define-key paredit-mode-map (read-kbd-macro key) nil))))
|
|
|
|
(use-package pulsar
|
|
:config
|
|
(pulsar-global-mode 1)
|
|
(add-hook 'next-error-hook #'pulsar-pulse-line))
|
|
|
|
(use-package rainbow-mode
|
|
:hook ((text-mode prog-mode) . rainbow-mode))
|
|
|
|
(use-package rainbow-delimiters
|
|
:hook (emacs-lisp-mode clojure-mode))
|
|
|
|
(use-package recentf-mode
|
|
:hook (after-init . recentf-mode)
|
|
:ensure nil)
|
|
|
|
(use-package restclient)
|
|
|
|
(use-package s)
|
|
|
|
(use-package savehist
|
|
:init
|
|
(savehist-mode))
|
|
|
|
(use-package so-long
|
|
:config
|
|
(global-so-long-mode))
|
|
|
|
(use-package swift-helpful
|
|
:commands swift-helpful)
|
|
|
|
(use-package swift-mode
|
|
:hook (swift-mode . subword-mode)
|
|
(swift-mode . electric-pair-local-mode)
|
|
:config
|
|
(setq
|
|
swift-mode:multiline-statement-offset 2
|
|
swift-mode:parenthesized-expression-offset 2
|
|
swift-mode:basic-offset 2
|
|
swift-mode:repl-executable "xcrun swift repl"))
|
|
|
|
(use-package system-packages)
|
|
|
|
(use-package tabspaces
|
|
:config
|
|
(tabspaces-mode)
|
|
:custom
|
|
(tabspaces-use-filtered-buffers-as-default t))
|
|
|
|
(use-package terraform-mode)
|
|
|
|
(use-package tree-sitter
|
|
:config
|
|
(global-tree-sitter-mode))
|
|
|
|
(use-package tree-sitter-langs
|
|
:after tree-sitter)
|
|
|
|
(use-package yaml-mode)
|
|
|
|
(use-package vertico
|
|
:init
|
|
(vertico-mode)
|
|
:config
|
|
(setq vertico-cycle t))
|
|
|
|
(use-package vertico-directory
|
|
:after vertico
|
|
:ensure nil
|
|
:hook (rfn-eshadow-update-overlay . vertico-directory-tidy)
|
|
:bind (:map vertico-map
|
|
("DEL" . vertico-directory-delete-char)
|
|
("M-DEL" . vertico-directory-delete-word)))
|
|
|
|
(use-package vterm
|
|
:if module-file-suffix)
|
|
|
|
(provide 'init)
|
|
;;; init.el ends here
|