summary refs log tree commit diff stats
path: root/lisp/acdw.el
blob: 69f9a7f845e9663f588f351c2026b953614389b4 (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
;;; acdw.el -*- lexical-binding: t; coding: utf-8-unix -*-
;; Author: Case Duckworth <acdw@acdw.net>
;; Created: Sometime during Covid-19, 2020
;; Keywords: configuration
;; URL: https://tildegit.org/acdw/emacs

;; This file is NOT part of GNU Emacs.

;;; License:
;; Everyone is permitted to do whatever with this software, without
;; limitation.  This software comes without any warranty whatsoever,
;; but with two pieces of advice:
;; - Don't hurt yourself.
;; - Make good choices.

;;; Commentary:
;; `acdw.el' contains `acdw/map', its mode, and assorted ease-of-life
;; functions for me, acdw.

;;; Code:

;; Utility constants

(defconst acdw/system (pcase system-type
            ('gnu/linux :home)
            ((or 'msdos 'windows-nt) :work)
            (_ :other))
  "Which computer system is currently being used.")


;; Utility functions

(defmacro when-unfocused (name &rest forms)
  "Define a function NAME, executing FORMS, that fires when Emacs
is unfocused."
  (declare (indent 1))
  (let ((func-name (intern (concat "when-unfocused-" (symbol-name name)))))
    `(progn
       (defun ,func-name () "Defined by `when-unfocused'."
              (when (seq-every-p #'null
                 (mapcar #'frame-focus-state (frame-list)))
                ,@forms))
       (add-function :after after-focus-change-function #',func-name))))

(defmacro hook-defun (name hooks &rest forms)
  "Define a function NAME that executes FORMS, and add it to
each hook in HOOKS."
  (declare (indent 2))
  (let ((func-name (intern (concat "hook-defun-" (symbol-name name))))
        (hook-list (if (consp hooks) hooks (list hooks)))
        (hook-defun-add-hook-list))
    `(progn
       (defun ,func-name () "Defined by `hook-defun'." ,@forms)
       ,@(dolist (hook hook-list hook-defun-add-hook-list)
          (push `(add-hook ',hook #',func-name) hook-defun-add-hook-list)))))

(defun refresh-emacs ()
  "Reload Emacs's configuration files."
  (interactive)
  (dolist (file (list (locate-user-emacs-file "early-init.el")
                      (locate-user-emacs-file "init.el" ".emacs")))
    (when (file-exists-p file)
      (load-file file))))

(defun acdw/dir (&optional file make-directory)
  "Place Emacs files in one place.

If called without parameters, `acdw/dir' expands to
~/.emacs.d/var or similar.  If called with FILE, `acdw/dir'
expands FILE to ~/.emacs.d/var, optionally making its directory
if MAKE-DIRECTORY is non-nil."
  (let ((dir (expand-file-name (convert-standard-filename "var/")
                               user-emacs-directory)))
    (if file
        (let ((file-name (expand-file-name (convert-standard-filename file)
                       dir)))
          (when make-directory
            (make-directory (file-name-directory file-name) 'parents))
          file-name)
      dir)))

(defun acdw/gc-enable ()
  "Enable the Garbage collector."
  (setq gc-cons-threshold (* 800 1024 1024)
    gc-cons-percentage 0.1))

(defun acdw/gc-disable ()
  "Functionally disable the Garbage collector."
  (setq gc-cons-threshold most-positive-fixnum
    gc-cons-percentage 0.8))


;; Make `C-z' more useful
(defvar acdw/leader
  (let ((map (make-sparse-keymap))
        (c-z (global-key-binding "\C-z")))
    (global-set-key "\C-z" map)
    (define-key map "\C-z" c-z)
    map))

(provide 'acdw)
;;; acdw.el ends here