aboutsummaryrefslogtreecommitdiff
path: root/bard-emacs-modules/bard-emacs-writing.el
blob: f8677a92baaade0d33c308fdd5d6d692dc3bb0bc (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
;;; Keyboard things
(setq default-input-method "cyrillic-yawerty")
(setq default-transient-input-method "cyrillic-yawerty")

(use-package denote
  :config
  (setq denote-directory "~/Notes/denote/")
  (setq denote-journal-extras-directory "~/Notes/journal")
  (setq denote-known-keywords
	'("emacs"
	  "linux"
	  "programming"
	  "org"
	  "school"
	  "language"
	  "history"
	  "biology"
	  ))
  (denote-rename-buffer-mode 1)
  (add-hook 'dired-mode-hook #'denote-dired-mode)

  ;; journalling with timer
  (add-hook 'denote-journal-extras-hook (lambda ()
                                          (tmr "10" "Journalling")
					  (bard/scroll-center-cursor-mode t)))

  :bind
  (("C-c n n" . denote-open-or-create)
   ("C-c n N" . denote)
   ("C-c R" . denote-region)
   ("C-c n d" . denote-date)
   ("C-c n o" . denote-sort-dired)
   ("C-c n j" . denote-journal-extras-new-entry)
   ("C-c n r" . denote-rename-file)
   ("C-c n r" . denote-rename-file-using-front-matter)
   ("C-c n k" . denote-keywords-add)
   ("C-c n K" . denote-keywords-remove)
   ("C-c n i" . denote-link)
   ("C-c n I" . denote-add-links)
   ("C-c n b" . denote-backlinks)
   ("C-c n f" . denote-find-link)
   ("C-c n F" . denote-find-backlink)))

(use-package denote-explore)

;;; Focus mode for wrigin

;; Center line scrolling for focused writing
(define-minor-mode bard/scroll-center-cursor-mode
  "Toggle centered cursor scrolling behavior."
  :init-value nil
  :lighter " S="
  :global nil
  (if bard/scroll-center-cursor-mode
      (setq-local scroll-margin (* (frame-height) 2)
		  scroll-conservatively 0
		  maximum-scroll-margin 0.5)
    (dolist (local '(scroll-preserve-screen-position
		     scroll-conservatively
		     maximum-scroll-margin
		     scroll-margin))
      (kill-local-variable `,local))))

(define-key global-map (kbd "C-c L") #'bard/scroll-center-cursor-mode)

(use-package olivetti
  :config
  (setq olivetti-minimum-body-width 100)
  (setq olivetti-recall-visual-line-mode-entry-state t)
  :hook
  ((olivetti-mode-on-hook . (lambda () (olivetti-set-width 100)))
   (olivetti-mode-hook . (lambda () (bard/scroll-center-cursor-mode t)))))

;; narrowing and focus mode
(use-package logos
  :config
  (defun logos-reveal-entry ()
    "Reveal Org or Outline entry."
    (cond
     ((and (eq major-mode 'org-mode)
           (org-at-heading-p))
      (org-show-subtree))
     ((or (eq major-mode 'outline-mode)
          (bound-and-true-p outline-minor-mode))
      (outline-show-subtree))))

  (setq logos-outlines-are-pages t)

  (setq logos-outline-regexp-alist
	`((emacs-lisp-mode . "^;;;+ ")
          (org-mode . "^\\* +")
          (t . ,(or outline-regexp logos--page-delimiter))))

  (setq-default logos-hide-cursor nil
		logos-hide-mode-line nil
		logos-hide-header-line t
		logos-hide-buffer-boundaries t
		logos-hide-fringe t
		logos-variable-pitch t
		logos-olivetti t)
  (let ((map global-map))
    (define-key map [remap narrow-to-region] #'logos-narrow-dwim)
    (define-key map [remap forward-page] #'logos-forward-page-dwim)
    (define-key map [remap backward-page] #'logos-backward-page-dwim)
    (define-key map (kbd "M-]") #'logos-forward-page-dwim)
    (define-key map (kbd "M-[") #'logos-backward-page-dwim)
    (define-key map (kbd "<f9>") #'logos-focus-mode))

  (defun bard/logos--recenter-top ()
    "Use `recenter' to reposition the view at the top."
    (unless (derived-mode-p 'prog-mode)
      (recenter 1))) ; Use 0 for the absolute top

  (add-hook 'logos-page-motion-hook #'bard/logos--recenter-top))

(provide 'bard-emacs-writing)