diff --git a/early-init.el b/early-init.el new file mode 100644 index 0000000..b39f4e2 --- /dev/null +++ b/early-init.el @@ -0,0 +1,24 @@ +;;; No GUI +(dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode)) + (when (fboundp mode) (funcall mode -1))) + +;; A big contributor to startup times is garbage collection. + +;; We up the gc threshold to temporarily prevent it from running, then +;; reset it later by enabling `gcmh-mode'. Not resetting it will cause +;; stuttering/freezes. + +(setq gc-cons-threshold most-positive-fixnum) + +;; When both .el and .elc / .eln files are available, +;; load the latest one. + +(setq load-prefer-newer t) + +;; Ensure that `describe-package' does not require a +;; `package-refresh-contents'. +(setq package-enable-at-startup t) + +;; Name the default frame +;; You can select a frame with M-x select-frame-by-name +(add-hook 'after-init-hook (lambda () (set-frame-name "unravel"))) diff --git a/init.el b/init.el new file mode 100644 index 0000000..27a7e27 --- /dev/null +++ b/init.el @@ -0,0 +1,56 @@ +;; Make native compilation silent and prune its cache. +(when (native-comp-available-p) + (setq native-comp-async-report-warnings-errors 'silent) ; Emacs 28 with native compilation + (setq native-compile-prune-cache t)) ; Emacs 29 + +;; Disable custom.el by making it disposable. +(setq custom-file (make-temp-file "emacs-custom-")) + +;; Enable these commands which have been disabled by default +(mapc + (lambda (command) + (put command 'disabled nil)) + '(list-timers narrow-to-region narrow-to-page upcase-region downcase-region)) + +;; Disable these commands which have been enabled by default +(mapc + (lambda (command) + (put command 'disabled t)) + '(eshell project-eshell overwrite-mode iconify-frame diary)) + +(mapc + (lambda (string) + (add-to-list 'load-path (locate-user-emacs-file string))) + '("unravel-modules")) + +;;;; Packages + +(setq package-vc-register-as-project nil) ; Emacs 30 + +(add-hook 'package-menu-mode-hook #'hl-line-mode) + +;; Also read: <https://protesilaos.com/codelog/2022-05-13-emacs-elpa-devel/> +(setq package-archives + '(("gnu-elpa" . "https://elpa.gnu.org/packages/") + ("gnu-elpa-devel" . "https://elpa.gnu.org/devel/") + ("nongnu" . "https://elpa.nongnu.org/nongnu/") + ("melpa" . "https://melpa.org/packages/"))) + +;; Highest number gets priority (what is not mentioned has priority 0) +(setq package-archive-priorities + '(("gnu-elpa" . 3) + ("melpa" . 2) + ("nongnu" . 1))) + +(setq package-install-upgrade-built-in t) + +(require 'unravel-theme) +;; (require 'unravel-essentials) +;; (require 'unravel-modeline) +;; (require 'unravel-completion) +;; (require 'unravel-search) +;; (require 'unravel-dired) +;; (require 'unravel-window) +;; (require 'unravel-git) +;; (require 'unravel-org) +;; (require 'unravel-langs) diff --git a/unravel-modules/unravel-theme.el b/unravel-modules/unravel-theme.el new file mode 100644 index 0000000..36f7572 --- /dev/null +++ b/unravel-modules/unravel-theme.el @@ -0,0 +1,257 @@ +;;; Everything related to the look of Emacs + +;;; The Ef (εὖ) themes + +;; The themes are customisable. Read the manual: +;; <https://protesilaos.com/emacs/ef-themes>. +(use-package ef-themes + :ensure t + :demand t + :bind + (("<f5>" . ef-themes-rotate) + ("C-<f5>" . ef-themes-select)) + :config + (setq ef-themes-to-toggle '(ef-elea-light ef-elea-dark) + ef-themes-variable-pitch-ui t + ef-themes-mixed-fonts t + ef-themes-headings ; read the manual's entry of the doc string + '((0 . (variable-pitch light 1.9)) + (1 . (variable-pitch light 1.8)) + (2 . (variable-pitch regular 1.7)) + (3 . (variable-pitch regular 1.6)) + (4 . (variable-pitch regular 1.5)) + (5 . (variable-pitch 1.4)) ; absence of weight means `bold' + (6 . (variable-pitch 1.3)) + (7 . (variable-pitch 1.2)) + (agenda-date . (semilight 1.5)) + (agenda-structure . (variable-pitch light 1.9)) + (t . (variable-pitch 1.1)))) + + (ef-themes-select 'ef-elea-light)) + +;;;; Lin +;; Read the lin manual: <https://protesilaos.com/emacs/lin>. +(use-package lin + :ensure t + :hook (after-init . lin-global-mode) ; applies to all `lin-mode-hooks' + :config + (setopt lin-face 'lin-cyan)) + +;;;; Increase padding of windows/frames +;; <https://protesilaos.com/codelog/2023-06-03-emacs-spacious-padding/>. +(use-package spacious-padding + :ensure t + :if (display-graphic-p) + :hook (after-init . spacious-padding-mode) + :init + ;; These are the defaults, but I keep it here for visiibility. + (setq spacious-padding-widths + '(:internal-border-width 30 + :header-line-width 4 + :mode-line-width 6 + :tab-width 4 + :right-divider-width 30 + :scroll-bar-width 8 + :left-fringe-width 20 + :right-fringe-width 20)) + + ;; Read the doc string of `spacious-padding-subtle-mode-line' as + ;; it is very flexible. + (setq spacious-padding-subtle-mode-line t)) + +;;; Cursor appearance (cursory) +;; Read the manual: <https://protesilaos.com/emacs/cursory>. +(use-package cursory + :ensure t + :demand t + :if (display-graphic-p) + :config + (setq cursory-presets + '((box + :blink-cursor-interval 1.2) + (box-no-blink + :blink-cursor-mode -1) + (bar + :cursor-type (bar . 2) + :blink-cursor-interval 0.8) + (bar-no-other-window + :inherit bar + :cursor-in-non-selected-windows nil) + (bar-no-blink + :cursor-type (bar . 2) + :blink-cursor-mode -1) + (underscore + :cursor-type (hbar . 3) + :blink-cursor-interval 0.3 + :blink-cursor-blinks 50) + (underscore-no-other-window + :inherit underscore + :cursor-in-non-selected-windows nil) + (underscore-thick + :cursor-type (hbar . 8) + :blink-cursor-interval 0.3 + :blink-cursor-blinks 50 + :cursor-in-non-selected-windows (hbar . 3)) + (underscore-thick-no-blink + :blink-cursor-mode -1 + :cursor-type (hbar . 8) + :cursor-in-non-selected-windows (hbar . 3)) + (t ; the default values + :cursor-type box + :cursor-in-non-selected-windows hollow + :blink-cursor-mode 1 + :blink-cursor-blinks 10 + :blink-cursor-interval 0.2 + :blink-cursor-delay 0.2))) + + ;; I am using the default values of `cursory-latest-state-file'. + + ;; Set last preset or fall back to desired style from `cursory-presets'. + (cursory-set-preset (or (cursory-restore-latest-preset) 'box)) + + (cursory-mode 1)) + +;;;; Theme buffet +;; <https://git.sr.ht/~bboal/theme-buffet> +(use-package theme-buffet + :ensure t + :after (:any modus-themes ef-themes) + :defer 1 + :config + (let ((modus-themes-p (featurep 'modus-themes)) + (ef-themes-p (featurep 'ef-themes))) + (setq theme-buffet-menu 'end-user) + (setq theme-buffet-time-offset 5) + (setq theme-buffet-end-user + '(:night (ef-dark ef-winter ef-autumn ef-night ef-duo-dark ef-symbiosis ef-owl) + :morning (ef-light ef-cyprus ef-spring ef-frost ef-duo-light ef-eagle) + :afternoon (ef-arbutus ef-day ef-kassio ef-summer ef-elea-light ef-maris-light ef-melissa-light ef-trio-light ef-reverie) + :evening (ef-rosa ef-elea-dark ef-maris-dark ef-melissa-dark ef-trio-dark ef-dream))) + + (when (or modus-themes-p ef-themes-p) + (theme-buffet-timer-hours 2)))) + +;;;; Fontaine (font configurations) +;; Read the manual: <https://protesilaos.com/emacs/fontaine> +(use-package fontaine + :ensure t + :if (display-graphic-p) + :hook + ;; Persist the latest font preset when closing/starting Emacs and + ;; while switching between themes. + ((after-init . fontaine-mode) + (after-init . (lambda () + ;; Set last preset or fall back to desired style from `fontaine-presets'. + (fontaine-set-preset (or (fontaine-restore-latest-preset) 'regular))))) + :config + ;; This is defined in Emacs C code: it belongs to font settings. + (setq x-underline-at-descent-line nil) + + ;; And this is for Emacs28. + (setq-default text-scale-remap-header-line t) + + ;; This is the default value. Just including it here for + ;; completeness. + (setq fontaine-latest-state-file (locate-user-emacs-file "fontaine-latest-state.eld")) + + (setq fontaine-presets + '((small + :default-height 80) + (regular) ; like this it uses all the fallback values and is named `regular' + (medium + :default-weight semilight + :default-height 115 + :bold-weight extrabold) + (large + :inherit medium + :default-height 150) + (live-stream + :default-family "Iosevka Comfy Wide Motion" + :default-height 150 + :default-weight medium + :fixed-pitch-family "Iosevka Comfy Wide Motion" + :variable-pitch-family "Iosevka Comfy Wide Duo" + :bold-weight extrabold) + (presentation + :default-height 180) + (jumbo + :default-height 260) + (t + ;; I keep all properties for didactic purposes, but most can be + ;; omitted. See the fontaine manual for the technicalities: + ;; <https://protesilaos.com/emacs/fontaine>. + :default-family "Iosevka Comfy" + :default-weight regular + :default-slant normal + :default-width normal + :default-height 100 + + :fixed-pitch-family "Iosevka Comfy" + :fixed-pitch-weight nil + :fixed-pitch-slant nil + :fixed-pitch-width nil + :fixed-pitch-height 1.0 + + :fixed-pitch-serif-family nil + :fixed-pitch-serif-weight nil + :fixed-pitch-serif-slant nil + :fixed-pitch-serif-width nil + :fixed-pitch-serif-height 1.0 + + :variable-pitch-family "Iosevka Comfy Motion Duo" + :variable-pitch-weight nil + :variable-pitch-slant nil + :variable-pitch-width nil + :variable-pitch-height 1.0 + + :mode-line-active-family nil + :mode-line-active-weight nil + :mode-line-active-slant nil + :mode-line-active-width nil + :mode-line-active-height 1.0 + + :mode-line-inactive-family nil + :mode-line-inactive-weight nil + :mode-line-inactive-slant nil + :mode-line-inactive-width nil + :mode-line-inactive-height 1.0 + + :header-line-family nil + :header-line-weight nil + :header-line-slant nil + :header-line-width nil + :header-line-height 1.0 + + :line-number-family nil + :line-number-weight nil + :line-number-slant nil + :line-number-width nil + :line-number-height 1.0 + + :tab-bar-family nil + :tab-bar-weight nil + :tab-bar-slant nil + :tab-bar-width nil + :tab-bar-height 1.0 + + :tab-line-family nil + :tab-line-weight nil + :tab-line-slant nil + :tab-line-width nil + :tab-line-height 1.0 + + :bold-family nil + :bold-slant nil + :bold-weight bold + :bold-width nil + :bold-height 1.0 + + :italic-family nil + :italic-weight nil + :italic-slant italic + :italic-width nil + :italic-height 1.0 + + :line-spacing nil)))) + +(provide 'unravel-theme)