1 (defvar darkroom-margins 0.15
2 "Margins to use in darkroom-mode.
6 - a floating point value betweeen 0 and 1, specifies percentage of
7 window width in columns to use as a margin.
9 - a cons cell (LEFT RIGHT) specifying the left and right margins
12 - a function that returns a cons cell interpreted like the
15 Value is effective when `darkroom-mode' is toggled, when
16 changing window or by calling `darkroom-set-margins'")
18 (defvar darkroom-turns-on-visual-line-mode t
19 "If non-nil pair `visual-line-mode' with
21 (defvar darkroom-fringes-outside-margins t
22 "If non-nil use fringes outside margins for `darkroom-mode'")
24 (defun darkroom-margins ()
25 (cond ((functionp darkroom-margins)
26 (funcall darkroom-margins))
27 ((consp darkroom-margins)
29 ((and (floatp darkroom-margins)
30 (< darkroom-margins 1))
31 (let ((delta (darkroom-float-to-columns darkroom-margins)))
32 (cons delta delta)))))
34 (defun darkroom-float-to-columns (f)
35 (ceiling (* (let ((edges (window-edges)))
36 (- (nth 2 edges) (nth 0 edges)))
39 (defun darkroom-set-margins (&optional margins)
40 "Adjust margins to `darkroom-margins' or optional MARGINS."
41 (let* ((window-configuration-change-hook nil)
44 (walk-windows #'(lambda (w)
45 (when (eq (window-buffer w) (current-buffer))
46 (setq fringes-outside-margins darkroom-fringes-outside-margins)
48 ;; `fringes-outside-margins' for the reason
49 ;; for this apparent noop
50 (set-window-buffer w (current-buffer))
51 (set-window-margins w (car margins) (cdr margins))))
55 (defun darkroom-increase-margins ()
57 (when (floatp darkroom-margins)
58 (setq darkroom-margins (+ 0.05 darkroom-margins))
59 (darkroom-set-margins)))
61 (defun darkroom-decrease-margins ()
63 (when (floatp darkroom-margins)
64 (setq darkroom-margins (- darkroom-margins 0.05))
65 (darkroom-set-margins)))
67 (defun darkroom-fill-paragraph-maybe (really)
69 (cond (visual-line-mode
71 (message "not filling paragraph")
72 (call-interactively 'fill-paragraph)
73 (message "filled paragraph even in visual-line-mode")))
75 (call-interactively 'fill-paragraph))))
77 (defvar darkroom-mode-map (let ((map (make-sparse-keymap)))
78 (define-key map (kbd "C-M-+") 'darkroom-increase-margins)
79 (define-key map (kbd "C-M--") 'darkroom-decrease-margins)
80 (define-key map (kbd "M-q") 'darkroom-fill-paragraph-maybe)
83 (defvar darkroom-saved-mode-line-format nil)
84 (defvar darkroom-saved-header-line-format nil)
85 (defvar darkroom-saved-visual-line-mode nil)
87 (make-variable-buffer-local 'darkroom-saved-mode-line-format)
88 (make-variable-buffer-local 'darkroom-saved-header-line-format)
89 (make-variable-buffer-local 'darkroom-saved-visual-line-mode)
91 (defun darkroom-visual-mode-maybe-enable ()
92 (when darkroom-turns-on-visual-line-mode
94 (setq darkroom-saved-visual-mode visual-line-mode)
97 (unless darkroom-saved-visual-line-mode
98 (visual-line-mode -1))))))
100 (define-minor-mode darkroom-mode
101 "Minor mode emulating the darkroom editor that I never used."
104 (setq darkroom-saved-mode-line-format mode-line-format
106 darkroom-saved-header-line-format header-line-format
107 header-line-format nil)
108 (darkroom-set-margins)
109 (darkroom-visual-mode-maybe-enable)
110 (text-scale-increase 2)
111 (add-hook 'window-configuration-change-hook 'darkroom-set-margins nil t))
113 (setq mode-line-format darkroom-saved-mode-line-format
114 header-line-format darkroom-saved-header-line-format)
115 (text-scale-decrease 2)
116 (darkroom-set-margins '(0 . 0))
117 (darkroom-visual-mode-maybe-enable)
118 (remove-hook 'window-configuration-change-hook 'darkroom-set-margins t))))
120 (defun darkroom-maybe-enable ()
121 (cond ((and (not darkroom-mode) (= (count-windows) 1))
123 ((and darkroom-mode (> (count-windows) 1))
126 (message "Hmm buffer: %s windows: %s darkroom-mode: %s"
132 (define-minor-mode darkroom-tentative-mode
133 "Minor mode that enters `darkroom-mode' when all windws are deleted"
135 (cond (darkroom-tentative-mode
136 (add-hook 'window-configuration-change-hook 'darkroom-maybe-enable nil t)
137 (darkroom-maybe-enable))
139 (darkroom-maybe-enable)
140 (remove-hook 'window-configuration-change-hook 'darkroom-maybe-enable t))))