Add darkroom mode
This commit is contained in:
parent
d1bc29e1ba
commit
98a93e73af
6 changed files with 439 additions and 1 deletions
|
@ -81,7 +81,7 @@
|
|||
'(package-enable-at-startup t)
|
||||
'(package-selected-packages
|
||||
(quote
|
||||
(dockerfile-mode ein spacemacs-theme flucui-themes leuven-theme htmlize scss-mode berrys-theme web-mode elpy python-docstring sphinx-doc sphinx-frontend sphinx-mode ox-nikola racket-mode slime gherkin-mode powershell typescript-mode ob-http ob-ipython ob-restclient nord-theme restclient request restclient-test yaml-mode magit)))
|
||||
(darkroom dockerfile-mode ein spacemacs-theme flucui-themes leuven-theme htmlize scss-mode berrys-theme web-mode elpy python-docstring sphinx-doc sphinx-frontend sphinx-mode ox-nikola racket-mode slime gherkin-mode powershell typescript-mode ob-http ob-ipython ob-restclient nord-theme restclient request restclient-test yaml-mode magit)))
|
||||
'(python-shell-interpreter "python3" t)
|
||||
'(register-preview-delay 2)
|
||||
'(register-separator 43)
|
||||
|
|
1
elpa/darkroom-0.2.signed
Normal file
1
elpa/darkroom-0.2.signed
Normal file
|
@ -0,0 +1 @@
|
|||
Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2019-09-21T19:56:21+0200 using RSA
|
36
elpa/darkroom-0.2/darkroom-autoloads.el
Normal file
36
elpa/darkroom-0.2/darkroom-autoloads.el
Normal file
|
@ -0,0 +1,36 @@
|
|||
;;; darkroom-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "darkroom" "darkroom.el" (0 0 0 0))
|
||||
;;; Generated autoloads from darkroom.el
|
||||
|
||||
(autoload 'darkroom-mode "darkroom" "\
|
||||
Remove visual distractions and focus on writing. When this
|
||||
mode is active, everything but the buffer's text is elided from
|
||||
view. The buffer margins are set so that text is centered on
|
||||
screen. Text size is increased (display engine allowing) by
|
||||
`darkroom-text-scale-increase'.
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(autoload 'darkroom-tentative-mode "darkroom" "\
|
||||
Enters `darkroom-mode' when all other windows are deleted.
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "darkroom" '("darkroom-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; darkroom-autoloads.el ends here
|
2
elpa/darkroom-0.2/darkroom-pkg.el
Normal file
2
elpa/darkroom-0.2/darkroom-pkg.el
Normal file
|
@ -0,0 +1,2 @@
|
|||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "darkroom" "0.2" "Remove visual distractions and focus on writing" '((cl-lib "0.5")) :url "http://elpa.gnu.org/packages/darkroom.html" :keywords '("convenience" "emulations") :authors '(("João Távora" . "joaotavora@gmail.com")) :maintainer '("João Távora" . "joaotavora@gmail.com"))
|
399
elpa/darkroom-0.2/darkroom.el
Normal file
399
elpa/darkroom-0.2/darkroom.el
Normal file
|
@ -0,0 +1,399 @@
|
|||
;;; darkroom.el --- Remove visual distractions and focus on writing -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2014 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: João Távora <joaotavora@gmail.com>
|
||||
;; Maintainer: João Távora <joaotavora@gmail.com>
|
||||
;; Keywords: convenience, emulations
|
||||
;; Package-Requires: ((cl-lib "0.5"))
|
||||
;; Version: 0.2
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; The main entrypoints to this extension are two minor modes:
|
||||
;;
|
||||
;; M-x darkroom-mode
|
||||
;; M-x darkroom-tentative-mode
|
||||
;;
|
||||
;; `darkroom-mode' makes visual distractions disappear: the
|
||||
;; mode-line is temporarily elided, text is enlarged and margins are
|
||||
;; adjusted so that it's centered on the window.
|
||||
;;
|
||||
;; `darkroom-tentative-mode' is similar, but it doesn't immediately
|
||||
;; turn-on `darkroom-mode', unless the current buffer lives in the
|
||||
;; sole window of the Emacs frame (i.e. all other windows are
|
||||
;; deleted). Whenever the frame is split to display more windows and
|
||||
;; more buffers, the buffer exits `darkroom-mode'. Whenever they are
|
||||
;; deleted, the buffer re-enters `darkroom-mode'.
|
||||
;;
|
||||
;; Personally, I always use `darkroom-tentative-mode'.
|
||||
;;
|
||||
;; See also the customization options `darkroom-margins' and
|
||||
;; `darkroom-fringes-outside-margins', which affect both modes.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'face-remap)
|
||||
|
||||
(defgroup darkroom nil
|
||||
"Remove visual distractions and focus on writing"
|
||||
:prefix "darkroom-"
|
||||
:group 'emulations)
|
||||
|
||||
(defcustom darkroom-margins 'darkroom-guess-margins
|
||||
"Margins to use in `darkroom-mode'.
|
||||
|
||||
Its 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 of a single argument, a window, that returns a cons
|
||||
cell interpreted like the previous option. An example is
|
||||
`darkroom-guess-margins', which see. Beware that this function
|
||||
is called very often, so if it does some non-trivial processing
|
||||
on the buffer's text, consider caching that value.
|
||||
|
||||
Value is effective when `darkroom-mode' is toggled."
|
||||
:type '(choice float
|
||||
(cons integer integer)
|
||||
(function-item darkroom-guess-margins :doc "Guess margins")
|
||||
(function darkroom-guess-margins))
|
||||
:group 'darkroom)
|
||||
|
||||
(defcustom darkroom-text-scale-increase 2
|
||||
"Steps to increase text size when in `darkroom-mode'.
|
||||
Value is passed to `text-scale-increase'."
|
||||
:type 'integer
|
||||
:group 'darkroom)
|
||||
|
||||
(defcustom darkroom-fringes-outside-margins t
|
||||
"If non-nil use fringes outside margins for `darkroom-mode'"
|
||||
:type 'boolean
|
||||
:group 'darkroom)
|
||||
|
||||
(defcustom darkroom-margin-increment 0.05
|
||||
"Increment to add used in `darkroom-increase-margins'."
|
||||
:type 'float
|
||||
:group 'darkroom)
|
||||
|
||||
(defcustom darkroom-margins-if-failed-guess 0.15
|
||||
"Margins when `darkroom-guess-margins' fails.
|
||||
If `darkroom-guess-margins' failed to figure out margins to
|
||||
center the text, use this percentage of window width for the
|
||||
symmetical margins."
|
||||
:type 'float
|
||||
:group 'darkroom)
|
||||
|
||||
(defcustom darkroom-verbose nil
|
||||
"If non-nil, be verbose about darkroom operations."
|
||||
:type 'boolean
|
||||
:group 'darkroom)
|
||||
|
||||
(defvar darkroom--guess-margins-statistics-cache nil
|
||||
"Cache used by `darkroom-guess-margins'.")
|
||||
|
||||
(defun darkroom--window-width (&optional window)
|
||||
"Calculate width of WINDOW in columns, considering text scaling.
|
||||
WINDOW defaults to the currently selected window. The function
|
||||
assumes the buffer to be filled with at least one character of an
|
||||
arbitrary, but fixed width. Narrowing is taken in consideration.
|
||||
The return value is a cons (COLS . SCALED-CHAR-WIDTH) where COLS
|
||||
is the desired width in columns and SCALED-CHAR-WIDTH is the
|
||||
width in pixels of a single character."
|
||||
(when (= (point-min) (point-max))
|
||||
(error "Cannot calculate the width of a single character"))
|
||||
(let* ((window (or window (selected-window)))
|
||||
(scaled-char-width (car (window-text-pixel-size
|
||||
window
|
||||
(point-min) (1+ (point-min)))))
|
||||
(char-width (frame-char-width))
|
||||
(margins (window-margins window)))
|
||||
(cons (truncate
|
||||
(+ (window-width window 'pixelwise)
|
||||
(* char-width (or (car margins) 0))
|
||||
(* char-width (or (cdr margins) 0)))
|
||||
scaled-char-width)
|
||||
scaled-char-width)))
|
||||
|
||||
(defun darkroom-guess-margins (window)
|
||||
"Guess suitable margins for `darkroom-margins'.
|
||||
If in suitable conditions, collect some statistics about the
|
||||
buffer's line lengths, and apply a heuristic to figure out how
|
||||
wide to set the margins, comparing it to WINDOW's width in
|
||||
columns. If the buffer's paragraphs are mostly filled to
|
||||
`fill-column', margins should center it on the window, otherwise,
|
||||
the margins specified in `darkroom-margins-if-failed-guess'.
|
||||
|
||||
In any of these conditions,`darkroom-margins-if-failed-guess' is
|
||||
also used:
|
||||
|
||||
* if `visual-line-mode' is on;
|
||||
* if `variable-pitch-mode' is on;
|
||||
* if the buffer is empty.
|
||||
|
||||
For testing purposes, WINDOW can also be an integer number which
|
||||
is a width in columns, in which case it will be used instead of a
|
||||
window's geometry."
|
||||
(if (or visual-line-mode
|
||||
(and buffer-face-mode
|
||||
(eq 'variable-pitch buffer-face-mode-face))
|
||||
(= (point-min) (point-max)))
|
||||
darkroom-margins-if-failed-guess
|
||||
(let* ((window-width-info (if (integerp window)
|
||||
window
|
||||
(darkroom--window-width window)))
|
||||
(window-width (car window-width-info))
|
||||
(scaled-char-width (cdr window-width-info))
|
||||
(top-quartile-avg
|
||||
(or darkroom--guess-margins-statistics-cache
|
||||
(set
|
||||
(make-local-variable 'darkroom--guess-margins-statistics-cache)
|
||||
(let* ((line-widths
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(cl-loop for start = (point)
|
||||
while (search-forward "\n"
|
||||
20000
|
||||
'no-error)
|
||||
for width = (truncate
|
||||
(car
|
||||
(window-text-pixel-size
|
||||
window
|
||||
start (1- (point))))
|
||||
scaled-char-width)
|
||||
unless (zerop width)
|
||||
collect width)))
|
||||
(n4 (max 1 (/ (length line-widths) 4))))
|
||||
(/ (apply '+ (cl-subseq (sort line-widths '>) 0 n4)) n4))))))
|
||||
(cond
|
||||
((> top-quartile-avg
|
||||
window-width)
|
||||
(message "Long lines detected. Consider turning on `visual-line-mode'")
|
||||
darkroom-margins-if-failed-guess)
|
||||
((> top-quartile-avg (* 0.9 fill-column))
|
||||
;; calculate margins so that `fill-column' + 1 colums are
|
||||
;; centered on the window.
|
||||
;;
|
||||
(let ((margin (truncate (* (- window-width (1+ fill-column))
|
||||
(/ (float scaled-char-width)
|
||||
(frame-char-width)))
|
||||
2)))
|
||||
(if darkroom-verbose
|
||||
(message "Choosing %s-wide margins based on fill-column %s"
|
||||
margin fill-column))
|
||||
(cons margin margin)))
|
||||
(t
|
||||
darkroom-margins-if-failed-guess)))))
|
||||
|
||||
(defun darkroom--compute-margins (window)
|
||||
"From `darkroom-margins', computes desired margins for WINDOW."
|
||||
(let ((darkroom-margins
|
||||
(if (functionp darkroom-margins)
|
||||
(funcall darkroom-margins window)
|
||||
darkroom-margins)))
|
||||
(cond ((consp darkroom-margins)
|
||||
darkroom-margins)
|
||||
((and (floatp darkroom-margins)
|
||||
(< darkroom-margins 1))
|
||||
(let ((delta (darkroom--float-to-columns darkroom-margins)))
|
||||
(cons delta delta)))
|
||||
(t
|
||||
(error "Illegal value in `darkroom-margins'")))))
|
||||
|
||||
(defun darkroom--float-to-columns (f)
|
||||
(ceiling (* (let ((edges (window-edges)))
|
||||
(- (nth 2 edges) (nth 0 edges)))
|
||||
f)))
|
||||
|
||||
(defvar darkroom--margin-factor 1
|
||||
"Buffer local factor affecting `darkroom--set-margins'")
|
||||
|
||||
(defun darkroom--set-margins ()
|
||||
"Set darkroom margins for currently selected window"
|
||||
(let* ((window-configuration-change-hook nil)
|
||||
(window (selected-window))
|
||||
(margins (darkroom--compute-margins window)))
|
||||
;; See description of
|
||||
;; `fringes-outside-margins' for the reason
|
||||
;; for this apparent noop
|
||||
(set-window-buffer window (current-buffer))
|
||||
(set-window-margins window
|
||||
(round
|
||||
(* darkroom--margin-factor
|
||||
(car margins)))
|
||||
(round
|
||||
(* darkroom--margin-factor
|
||||
(cdr margins))))))
|
||||
|
||||
(defun darkroom--reset-margins ()
|
||||
"Reset darkroom margins for currently selected window."
|
||||
(set-window-margins (selected-window) 0 0))
|
||||
|
||||
(defun darkroom-increase-margins (increment)
|
||||
"Increase darkroom margins by INCREMENT."
|
||||
(interactive (list darkroom-margin-increment))
|
||||
(set (make-local-variable 'darkroom--margin-factor)
|
||||
(* darkroom--margin-factor (+ 1 increment)))
|
||||
(mapc #'(lambda (w)
|
||||
(with-selected-window w
|
||||
(darkroom--set-margins)))
|
||||
(get-buffer-window-list (current-buffer))))
|
||||
|
||||
(defun darkroom-decrease-margins (decrement)
|
||||
"Decrease darkroom margins by DECREMENT."
|
||||
(interactive (list darkroom-margin-increment))
|
||||
(darkroom-increase-margins (- decrement)))
|
||||
|
||||
(defvar darkroom-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)
|
||||
map))
|
||||
|
||||
(defconst darkroom--saved-variables
|
||||
'(mode-line-format
|
||||
header-line-format
|
||||
fringes-outside-margins)
|
||||
"Variables saved in `darkroom--saved-state'")
|
||||
|
||||
(defvar darkroom--saved-state nil
|
||||
"Saved state before `darkroom-mode' is turned on.
|
||||
Alist of (VARIABLE . BEFORE-VALUE)")
|
||||
|
||||
;; (defvar darkroom--saved-text-scale-mode-amount nil
|
||||
;; "Text scale before `darkroom-mode' is turned on.")
|
||||
|
||||
(defun darkroom--enter (&optional just-margins)
|
||||
"Save current state and enter darkroom for the current buffer.
|
||||
With optional JUST-MARGINS, just set the margins."
|
||||
(unless just-margins
|
||||
(setq darkroom--saved-state
|
||||
(mapcar #'(lambda (sym)
|
||||
(cons sym (buffer-local-value sym (current-buffer))))
|
||||
darkroom--saved-variables))
|
||||
(setq mode-line-format nil
|
||||
header-line-format nil
|
||||
fringes-outside-margins darkroom-fringes-outside-margins)
|
||||
(text-scale-increase darkroom-text-scale-increase))
|
||||
(mapc #'(lambda (w)
|
||||
(with-selected-window w
|
||||
(darkroom--set-margins)))
|
||||
(get-buffer-window-list (current-buffer))))
|
||||
|
||||
(defun darkroom--leave ()
|
||||
"Undo the effects of `darkroom--enter'."
|
||||
(mapc #'(lambda (pair)
|
||||
(set (make-local-variable (car pair)) (cdr pair)))
|
||||
darkroom--saved-state)
|
||||
(setq darkroom--saved-state nil)
|
||||
(text-scale-mode -1)
|
||||
(mapc #'(lambda (w)
|
||||
(with-selected-window w
|
||||
(darkroom--reset-margins)))
|
||||
(get-buffer-window-list (current-buffer))))
|
||||
|
||||
(defun darkroom--enter-or-leave ()
|
||||
"Enter or leave darkroom according to window configuration."
|
||||
(cond ((= (count-windows) 1)
|
||||
(darkroom--enter darkroom--saved-state))
|
||||
(darkroom--saved-state
|
||||
(darkroom--leave))
|
||||
(t
|
||||
;; for clarity, don't do anything
|
||||
)))
|
||||
|
||||
(declare-function darkroom-tentative-mode "darkroom" t)
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode darkroom-mode
|
||||
"Remove visual distractions and focus on writing. When this
|
||||
mode is active, everything but the buffer's text is elided from
|
||||
view. The buffer margins are set so that text is centered on
|
||||
screen. Text size is increased (display engine allowing) by
|
||||
`darkroom-text-scale-increase'." nil nil nil
|
||||
(when darkroom-tentative-mode
|
||||
(display-warning
|
||||
'darkroom
|
||||
(concat "Turning off `darkroom-tentative-mode' first. "
|
||||
"It doesn't go with `darkroom-mode'.")
|
||||
(let ((darkroom-mode nil))
|
||||
(darkroom-tentative-mode -1))))
|
||||
(cond (darkroom-mode
|
||||
(darkroom--enter)
|
||||
(add-hook 'window-configuration-change-hook 'darkroom--set-margins
|
||||
t t))
|
||||
(t
|
||||
(darkroom--leave)
|
||||
(remove-hook 'window-configuration-change-hook 'darkroom--set-margins
|
||||
t))))
|
||||
|
||||
;;;###autoload
|
||||
(define-minor-mode darkroom-tentative-mode
|
||||
"Enters `darkroom-mode' when all other windows are deleted."
|
||||
nil " Room" darkroom-mode-map
|
||||
;; always begin by removing the hook
|
||||
;;
|
||||
(remove-hook 'window-configuration-change-hook
|
||||
'darkroom--enter-or-leave 'local)
|
||||
(when darkroom-mode
|
||||
(display-warning
|
||||
'darkroom
|
||||
(concat "Turning off `darkroom-mode' first. "
|
||||
"It doesn't go with `darkroom-tentative-mode'.")
|
||||
(let ((darkroom-tentative-mode nil))
|
||||
(darkroom-mode -1))))
|
||||
;; turn darkroom on or off according to window state
|
||||
;;
|
||||
(cond (darkroom-tentative-mode
|
||||
;; re-add the hook when we are turning ourselves on
|
||||
;;
|
||||
(add-hook 'window-configuration-change-hook
|
||||
'darkroom--enter-or-leave 'append 'local)
|
||||
;; call this right away if we're supposed to turn darkroom on
|
||||
;; immediately.
|
||||
;;
|
||||
(darkroom--enter-or-leave))
|
||||
(t
|
||||
(darkroom--leave))))
|
||||
|
||||
;;;; ChangeLog:
|
||||
|
||||
;; 2019-03-15 João Távora <joaotavora@gmail.com>
|
||||
;;
|
||||
;; Update packages/darkroom from upstream
|
||||
;;
|
||||
;; Merge subtree commit '30d1b83a8cf7abfad8281f5d063e3316338bdfa4'
|
||||
;;
|
||||
;; 2015-03-28 João Távora <joaotavora@gmail.com>
|
||||
;;
|
||||
;; Update packages/darkroom by merging its external subtree
|
||||
;;
|
||||
;; 2014-12-19 João Távora <joaotavora@gmail.com>
|
||||
;;
|
||||
;; Add packages/darkroom by merging its upstream subtree
|
||||
;;
|
||||
;; * externals-list ("darkroom"): New subtree entry
|
||||
;;
|
||||
|
||||
|
||||
|
||||
(provide 'darkroom)
|
||||
;;; darkroom.el ends here
|
BIN
elpa/darkroom-0.2/darkroom.elc
Normal file
BIN
elpa/darkroom-0.2/darkroom.elc
Normal file
Binary file not shown.
Loading…
Add table
Reference in a new issue