From: João Távora Date: Thu, 30 Aug 2012 19:51:37 +0000 (+0100) Subject: Initial commit X-Git-Url: https://code.delx.au/gnu-emacs-elpa/commitdiff_plain/a16a665328a25905909d29eefc419591ff47d376 Initial commit --- a16a665328a25905909d29eefc419591ff47d376 diff --git a/darkroom.el b/darkroom.el new file mode 100644 index 000000000..e1c59c034 --- /dev/null +++ b/darkroom.el @@ -0,0 +1,99 @@ +(defvar darkroom-margins 0.15 + "Margins to use in darkroom-mode. + +It's value can be: + +- a floating point value betweeen 0 and 1, specifies percentage of + window width in columns to use as a margin. + +- a cons cell (LEFT RIGHT) specifying the left and right margins + in columns. + +- a function that returns a cons cell interpreted like the + previous option. + +Value is effective when `darkroom-minor-mode' is toggled, when +changing window or by calling `darkroom-set-margins'") + +(defvar darkroom-turns-on-visual-line-mode t + "If non-nil pair `visual-line-mode' with + `darkroom-minor-mode'") +(defvar darkroom-fringes-outside-margins t + "If non-nil use fringes outside margins for `darkroom-minor-mode'") + +(defun darkroom-margins () + (cond ((functionp darkroom-margins) + (funcall darkroom-margins)) + ((consp darkroom-margins) + darkroom-margins) + ((and (floatp darkroom-margins) + (< darkroom-margins 1)) + (let ((delta (darkroom-float-to-columns darkroom-margins))) + (cons delta delta))))) + +(defun darkroom-float-to-columns (f) + (ceiling (* (let ((edges (window-edges))) + (- (nth 2 edges) (nth 0 edges))) + f))) + +(defun darkroom-set-margins (&optional margins) + "Adjust margins to `darkroom-margins' or optional MARGINS." + (let ((margins + (or margins + (darkroom-margins)))) + (when margins + (set-window-margins (selected-window) (car margins) (cdr margins))))) + +(defun darkroom-increase-margins () + (interactive) + (when (floatp darkroom-margins) + (setq darkroom-margins (+ 0.05 darkroom-margins)) + (darkroom-set-margins))) + +(defun darkroom-decrease-margins () + (interactive) + (when (floatp darkroom-margins) + (setq darkroom-margins (- darkroom-margins 0.05)) + (darkroom-set-margins))) + +(defun darkroom-confirm-fill-paragraph () + (interactive) + (when (yes-or-no-p "Really fill paragraph?") + (call-interactively 'fill-paragraph))) + +(defvar darkroom-minor-mode-map (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-M-+") 'darkroom-increase-margins) + (define-key map (kbd "C-M--") 'darkroom-decrease-margins) + (define-key map (kbd "M-q") 'darkroom-confirm-fill-paragraph) + map)) + +(defvar darkroom-saved-mode-line-format nil) +(defvar darkroom-saved-visual-mode nil) +(define-minor-mode darkroom-minor-mode + "A minor mode that emulates the darkroom editor." + nil + " dark" + nil + (cond (darkroom-minor-mode + (setq darkroom-saved-mode-line-format mode-line-format + mode-line-format nil) + (setq fringes-outside-margins darkroom-fringes-outside-margins) + (add-hook 'window-configuration-change-hook 'darkroom-set-margins nil t) + (darkroom-set-margins) + (setq header-line-format t) + ;; a hack shoulnd't be needed but apparently is + (set-window-buffer (selected-window) (current-buffer)) + (when darkroom-turns-on-visual-line-mode + (visual-line-mode 1))) + (t + (setq header-line-format nil) + (setq mode-line-format darkroom-saved-mode-line-format) + (when darkroom-turns-on-visual-line-mode + (visual-line-mode -1)) + (remove-hook 'window-configuration-change-hook 'darkroom-set-margins t) + (set-window-margins (selected-window) 0 0)))) + + + + +(provide 'darkroom)