summaryrefslogtreecommitdiff
path: root/lisp/ss-core.el
blob: 3be07113e07c71c8f963fc50bed1bcd683ce4209 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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