(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-" . 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) (electric-pair-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 paredit :hook ((lisp-mode emacs-lisp-mode clojure-mode) . paredit-mode)) (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) :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