summaryrefslogtreecommitdiff
path: root/lisp/ss-core.el
diff options
context:
space:
mode:
authorSzymon Szukalski <szymon@szymonszukalski.com>2026-04-09 10:53:27 +1000
committerSzymon Szukalski <szymon@szymonszukalski.com>2026-04-09 10:53:27 +1000
commitbc75732b9d37b77945a977ee9f7892cf6efc79c3 (patch)
tree4d9273ccc12c29eccc44fdc12372bea047414353 /lisp/ss-core.el
parent12a5b1464bb919ba23f2aa6c22d44de81e382151 (diff)
Refactor Emacs config into modules
Diffstat (limited to 'lisp/ss-core.el')
-rw-r--r--lisp/ss-core.el147
1 files changed, 147 insertions, 0 deletions
diff --git a/lisp/ss-core.el b/lisp/ss-core.el
new file mode 100644
index 0000000..3be0711
--- /dev/null
+++ b/lisp/ss-core.el
@@ -0,0 +1,147 @@
+;;; ss-core.el --- Shared core setup -*- lexical-binding: t; -*-
+
+;;; Commentary:
+
+;; Shared startup helpers, package bootstrap, paths, and editor defaults.
+
+;;; Code:
+
+(require 'subr-x)
+
+(defconst ss-minimum-emacs-version "27.1"
+ "Minimum supported Emacs version.")
+
+(defconst ss-warning-emacs-version "28.1"
+ "Version threshold for compatibility warnings.")
+
+(defconst ss-spell-check-support-enabled nil)
+(defconst ss-is-windows (memq system-type '(windows-nt ms-dos cygwin)))
+(defconst ss-is-linux (eq system-type 'gnu/linux))
+(defconst ss-is-mac (eq system-type 'darwin))
+
+(defconst ss-org-directory (expand-file-name "~/org/")
+ "Root directory for Org files.")
+
+(defconst ss-journal-file (expand-file-name "journal.org" ss-org-directory)
+ "Single-file work journal for operational capture.")
+
+(defconst ss-org-projects-directory (expand-file-name "projects/" ss-org-directory)
+ "Directory for project notes.")
+
+(defconst ss-org-areas-directory (expand-file-name "areas/" ss-org-directory)
+ "Directory for area notes.")
+
+(defconst ss-org-resources-directory (expand-file-name "resources/" ss-org-directory)
+ "Directory for resource notes.")
+
+(defconst ss-org-archives-directory (expand-file-name "archives/" ss-org-directory)
+ "Directory for archived notes.")
+
+(defconst ss-moc-file (expand-file-name "moc.org" ss-org-directory)
+ "Central MOC note.")
+
+(defconst ss-crm-file (expand-file-name "areas/people/people.org" ss-org-directory)
+ "Single source of truth for the people CRM.")
+
+(defconst ss-journal-section-headings
+ '("Tasks" "Notes" "Meetings")
+ "Per-day section headings maintained under each journal datetree entry.")
+
+(defconst ss-org-agenda-directories
+ (list ss-org-projects-directory
+ ss-org-areas-directory
+ ss-org-resources-directory)
+ "Directories whose Org files feed the agenda.")
+
+(defun ss-feature-enabled-p (feature)
+ "Return non-nil when FEATURE is enabled in `ss-enabled-features'."
+ (memq feature ss-enabled-features))
+
+(defun ss-require-existing-directory (directory)
+ "Return DIRECTORY, signaling when it does not exist."
+ (unless (file-directory-p directory)
+ (user-error "Directory does not exist: %s" directory))
+ directory)
+
+(defun ss-require-existing-file (file)
+ "Return FILE, signaling when it does not exist."
+ (unless (file-exists-p file)
+ (user-error "File does not exist: %s" file))
+ file)
+
+(defun ss-enable-prose-abbrev-mode ()
+ "Enable abbrev mode in prose buffers.
+We keep this mode-local so code buffers stay on their own completion rules."
+ (abbrev-mode 1))
+
+(defun ss-core-setup ()
+ "Initialize shared core behavior."
+ (let ((minver ss-minimum-emacs-version))
+ (when (version< emacs-version minver)
+ (error "Your Emacs is too old -- this config requires v%s or higher" minver)))
+ (when (version< emacs-version ss-warning-emacs-version)
+ (message
+ (concat
+ "Your Emacs is old, and some functionality in this config will be "
+ "disabled. Please upgrade if possible.")))
+
+ ;; Keep custom-set-variables out of the main config.
+ (setq custom-file (expand-file-name "custom.el" user-emacs-directory))
+
+ (require 'package)
+ (setq package-archives
+ (append '(("melpa" . "https://melpa.org/packages/"))
+ package-archives)
+ package-archive-priorities '(("gnu" . 10)
+ ("nongnu" . 8)
+ ("melpa" . 5))
+ package-install-upgrade-built-in t
+ use-package-always-ensure nil)
+ (package-initialize)
+ (require 'use-package)
+ (require 'abbrev)
+
+ (set-language-environment "UTF-8")
+ (set-default-coding-systems 'utf-8)
+ (prefer-coding-system 'utf-8)
+
+ (setq abbrev-file-name (expand-file-name "abbrev_defs" user-emacs-directory)
+ save-abbrevs 'silently)
+ (when (file-exists-p abbrev-file-name)
+ (quietly-read-abbrev-file abbrev-file-name))
+
+ (dolist (hook '(text-mode-hook org-mode-hook))
+ (add-hook hook #'ss-enable-prose-abbrev-mode))
+
+ (setq auto-save-default nil
+ backup-inhibited t
+ echo-keystrokes 0.1
+ compilation-ask-about-save nil
+ mouse-wheel-scroll-amount '(1 ((shift) . 1))
+ mouse-wheel-progressive-speed nil
+ mouse-wheel-follow-mouse t
+ scroll-step 1
+ scroll-conservatively 101
+ enable-recursive-minibuffers t
+ gc-cons-threshold (* 128 1024 1024)
+ read-process-output-max (* 4 1024 1024)
+ process-adaptive-read-buffering nil)
+
+ (fset 'yes-or-no-p 'y-or-n-p)
+ (global-auto-revert-mode 1)
+ (delete-selection-mode 1)
+
+ (setq-default indent-tabs-mode nil
+ fill-column 80
+ tab-width 2
+ indicate-empty-lines t
+ sentence-end-double-space nil))
+
+(defun ss-core-load-custom-file ()
+ "Load `custom-file' when it exists."
+ (when (file-exists-p custom-file)
+ (load custom-file nil 'nomessage)))
+
+(provide 'ss-core)
+
+;;; ss-core.el ends here