You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2027 lines
57KB

  1. ;;; package --- Summary
  2. ;;; Commentary:
  3. ;;; Code:
  4. ;;; Use-package
  5. ;; Use package and melpa as source
  6. (require 'package)
  7. (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
  8. (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/"))
  9. (setq package-enable-at-startup nil)
  10. (package-initialize)
  11. ;; use-package
  12. (setq-default
  13. use-package-always-ensure t
  14. use-package-expand-minimally t
  15. use-package-verbose nil
  16. use-package-enable-imenu-support t)
  17. (unless (package-installed-p 'use-package)
  18. (package-refresh-contents)
  19. (package-install 'use-package))
  20. (eval-when-compile (require 'use-package))
  21. ;;; Custom and options
  22. ;;;; Custom file
  23. (setq custom-file "~/Projects/dotfiles/.emacs.d/custom.el")
  24. (load custom-file)
  25. ;;;; Options
  26. ;;;;; Mode-line
  27. (setq
  28. ;; Mnemonics for eol
  29. eol-mnemonic-unix "(Unix)"
  30. ;; Display total size of buffer and column index
  31. size-indication-mode t
  32. ;; Column numbers
  33. column-number-mode t
  34. ;; Column numbers from 1
  35. column-number-indicator-zero-based nil)
  36. ;;;;; Backup
  37. (setq
  38. ;; delete excess backup versions silently
  39. delete-old-versions t
  40. ;; make backup files
  41. make-backup-files t
  42. ;; Use version control on backups
  43. version-control t
  44. ;; don't make backups file when in version controlled dir
  45. vc-make-backup-files nil
  46. ;; which directory to put backups file
  47. backup-directory-alist `(("." . "~/.emacs.d/backups")
  48. (,tramp-file-name-regexp nil)))
  49. ;;;;; Autosave
  50. (setq
  51. ;; Enable
  52. auto-save-default t
  53. ;; Set interval and timeout
  54. auto-save-interval 300
  55. auto-save-timeout 30
  56. ;; Set directory for auto-saves
  57. auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-save/" t)))
  58. ;;;;; Scrolling
  59. (setq
  60. scroll-margin 10
  61. hscroll-margin 10
  62. scroll-conservatively 100000
  63. scroll-preserve-screen-position 1
  64. hscroll-step 1
  65. maximum-scroll-margin 0.5)
  66. ;;;;; Disable GUI
  67. (menu-bar-mode -1)
  68. (tool-bar-mode -1)
  69. (scroll-bar-mode -1)
  70. (blink-cursor-mode -1)
  71. (tooltip-mode -1)
  72. (setq
  73. inhibit-startup-screen t
  74. inhibit-startup-message t
  75. inhibit-startup-echo-area-message t)
  76. ;;;;; UTF8
  77. (setq
  78. coding-system-for-read 'utf-8
  79. coding-system-for-write 'utf-8)
  80. ;; Prefer UTF-8
  81. (prefer-coding-system 'utf-8)
  82. (set-default-coding-systems 'utf-8)
  83. (set-terminal-coding-system 'utf-8)
  84. (set-keyboard-coding-system 'utf-8)
  85. ;;;;; Open new windows vertically
  86. (setq split-height-threshold nil
  87. split-width-threshold 80)
  88. ;;;;; Set proxy at work
  89. (when (equal (system-name) "hegp")
  90. (setq url-proxy-services '(("no_proxy" . "127.0.0.1")
  91. ("http" . "proxym-inter.aphp.fr:8080")
  92. ("https" . "proxym-inter.aphp.fr:8080"))))
  93. ;;;;; Misc
  94. ;; Fix dead_circumflex with ibus
  95. (require 'iso-transl)
  96. ;; Stop warning when using narrow
  97. (put 'narrow-to-region 'disabled nil)
  98. (put 'dired-find-alternate-file 'disabled nil)
  99. (setq
  100. initial-scratch-message ""
  101. fill-column 100
  102. ;; Kill debug windows after use
  103. debugger-bury-or-kill 'kill
  104. ;; Scroll smoothly with mouse
  105. mouse-wheel-scroll-amount '(2 ((shift) . 1) ((control)))
  106. ;; Indent two spaces
  107. standard-indent 2
  108. ;; don't ask for confirmation when opening symlinked file
  109. vc-follow-symlinks t
  110. ;; silent bell when you make a mistake
  111. ring-bell-function 'ignore
  112. ;; Identity
  113. user-full-name "Maxime Wack"
  114. ;; GC and file size limits
  115. gc-cons-threshold 50000000
  116. large-file-warning-threshold 100000000
  117. ;; Filename in title
  118. frame-title-format
  119. '((:eval (if (buffer-file-name)
  120. (abbreviate-file-name (buffer-file-name))
  121. "%b"))))
  122. (setq-default
  123. ;; Show empty lines at the end of the buffer
  124. indicate-empty-lines t
  125. ;; Spaces for indent
  126. tab-width 2
  127. ;; Don't use tabs in indentation
  128. indent-tabs-mode nil)
  129. ;; Add for emacs server
  130. (add-to-list 'default-frame-alist '(font . "FiraEmacs 10"))
  131. (add-to-list 'default-frame-alist '(alpha . (85 . 95)))
  132. ;; Set transparency
  133. (set-frame-parameter (selected-frame) 'alpha '(85 . 95))
  134. ;; Font
  135. (unless (equal (system-name) "hegp")
  136. (set-frame-font "FiraEmacs 10" nil t))
  137. ;; Replace yes/no with y/n
  138. (fset 'yes-or-no-p 'y-or-n-p)
  139. (defun package--save-selected-packages (&rest opt)
  140. "Disable package-selected-packages.
  141. OPT is the optional arg to the original function"
  142. nil)
  143. ;;; Packages
  144. ;;;; Keys
  145. ;;;;; General
  146. (defun maxx/kill-unmodified-buffers ()
  147. "Kill all the undmodified buffers."
  148. (interactive)
  149. (seq-do 'kill-buffer
  150. (seq-filter (lambda (x) (not (buffer-modified-p x))) (buffer-list))))
  151. (use-package general
  152. :demand
  153. :config
  154. (general-create-definer spcleader
  155. :states '(normal visual insert emacs)
  156. :prefix "SPC"
  157. :non-normal-prefix "M-SPC")
  158. (spcleader
  159. "RET" 'eval-defun
  160. "|" 'shell-command-on-region
  161. "." 'eval-expression
  162. "k" 'kill-buffer-and-window
  163. "$" '((lambda () (interactive) (find-file "~/.emacs")) :which-key "open config")
  164. "#" '((lambda () (interactive) (load-file "~/.emacs")) :which-key "reload config")
  165. "l" 'reposition-window
  166. "W" '(count-words-region :which-key "word count")
  167. "w" 'toggle-truncate-lines)
  168. (spcleader
  169. "K" '(:ignore t :which-key "Kill buffers")
  170. "Kk" 'kill-some-buffers
  171. "Km" '(maxx/kill-unmodified-buffers :which-key "Kill unmodified"))
  172. (spcleader
  173. "n" '(:ignore t :which-key "Narrow")
  174. "nr" 'narrow-to-region
  175. "np" 'narrow-to-page
  176. "nf" 'narrow-to-defun
  177. "nc" 'polymode-toggle-chunk-narrowing
  178. "nw" 'widen)
  179. (spcleader
  180. "m" '(:ignore t :which-key "Modes")
  181. "mo" 'org-mode
  182. "mm" 'mu4e
  183. "me" 'eshell
  184. "mc" 'calc
  185. "mC" 'calendar
  186. "mr" 'ess-r-mode
  187. "mw" 'woman))
  188. ;;;;; Hydra
  189. (use-package hydra)
  190. ;;;;; Evil
  191. ;;;;;; Evil
  192. (use-package evil
  193. :demand
  194. :config
  195. (evil-mode t)
  196. (setq evil-want-integration nil
  197. evil-want-keybinding nil
  198. evil-want-Y-yank-to-eol t
  199. ;; Colored cursors based on evil-state
  200. evil-emacs-state-cursor '("red" box)
  201. evil-normal-state-cursor '("green" box)
  202. evil-visual-state-cursor '("orange" box)
  203. evil-insert-state-cursor '("red" bar)
  204. evil-replace-state-cursor '("red" bar)
  205. evil-operator-state-cursor '("red" hollow)
  206. ;; use NORMAL mode/state EVERYWHERE by default
  207. evil-default-state 'normal
  208. evil-motion-state-modes nil
  209. evil-normal-state-modes nil
  210. evil-insert-state-modes nil
  211. ;; Use emacs state in these selected modes
  212. evil-emacs-state-modes nil
  213. ;; and don't let modes override the INSERT state (!)
  214. evil-overriding-maps nil
  215. evil-intercept-maps nil)
  216. (defmacro define-and-bind-text-object (key start-regex end-regex)
  217. (let ((inner-name (make-symbol "inner-name"))
  218. (outer-name (make-symbol "outer-name")))
  219. `(progn
  220. (evil-define-text-object ,inner-name (count &optional beg end type)
  221. (evil-select-paren ,start-regex ,end-regex beg end type count nil))
  222. (evil-define-text-object ,outer-name (count &optional beg end type)
  223. (evil-select-paren ,start-regex ,end-regex beg end type count t))
  224. (define-key evil-inner-text-objects-map ,key (quote ,inner-name))
  225. (define-key evil-outer-text-objects-map ,key (quote ,outer-name)))))
  226. (define-and-bind-text-object "_" "_" "_")
  227. (define-and-bind-text-object "-" "-" "-")
  228. ;; Set alias w/W to save-buffer (to continue using :w to save)
  229. (defalias 'w 'save-buffer)
  230. (defalias 'W 'save-buffer)
  231. (defhydra hydra-window (:color red :timeout .3)
  232. "Windows"
  233. ("t" evil-window-left)
  234. ("T" evil-window-move-far-left)
  235. ("s" evil-window-down)
  236. ("S" evil-window-move-very-bottom)
  237. ("d" evil-window-up)
  238. ("D" evil-window-move-very-top)
  239. ("r" evil-window-right)
  240. ("R" evil-window-move-far-right)
  241. ("+" (evil-window-increase-height 4))
  242. ("-" (evil-window-decrease-height 4))
  243. ("/" (evil-window-decrease-width 4))
  244. ("*" (evil-window-increase-width 4))
  245. ("=" (balance-windows))
  246. ("h" evil-window-split)
  247. ("v" evil-window-vsplit)
  248. ("c" evil-window-delete)
  249. ("o" delete-other-windows)
  250. ("é" nil "Cancel"))
  251. :general
  252. (:states 'visual
  253. "l" 'evil-delete
  254. "H" 'evil-change
  255. "J" 'evil-join)
  256. (:states '(visual normal motion emacs)
  257. "é" 'hydra-window/body)
  258. (:states '(normal motion)
  259. "t" 'evil-backward-char
  260. "s" 'evil-next-visual-line
  261. "d" 'evil-previous-visual-line
  262. "r" 'evil-forward-char
  263. "T" 'evil-window-top
  264. "S" 'evil-scroll-down
  265. "D" 'evil-scroll-up
  266. "R" 'evil-window-bottom
  267. "l" 'evil-delete
  268. "L" 'evil-delete-line
  269. "h" 'evil-replace
  270. "H" 'evil-replace-state
  271. "gs" 'evil-next-line
  272. "gd" 'evil-previous-line
  273. "M" 'evil-window-middle
  274. "j" 'evil-find-char-to
  275. ";" 'evil-repeat-find-char-reverse
  276. "," 'evil-repeat-find-char
  277. "/" 'counsel-grep-or-swiper
  278. "÷" 'evil-ex
  279. "zt" 'evil-close-fold
  280. "zT" 'evil-close-folds
  281. "zr" 'evil-open-fold
  282. "zR" 'evil-open-folds
  283. "za" '(lambda () (interactive)
  284. (hs-life-goes-on
  285. (if (hs-already-hidden-p)
  286. (progn
  287. (hs-show-block)
  288. (hs-hide-level 1))
  289. (hs-hide-block))))
  290. "zA" 'evil-toggle-fold
  291. "gt" 'previous-buffer
  292. "gr" 'next-buffer
  293. "gf" 'evil-find-file-at-point-with-line
  294. "C-s" 'evil-scroll-line-down
  295. "C-d" 'evil-scroll-line-up
  296. "C-o" 'evil-jump-backward)
  297. (:states 'insert
  298. "C-r" 'counsel-yank-pop
  299. "C-u" 'counsel-unicode-char
  300. "_" 'self-insert-command))
  301. ;;;;;; Evil-numbers
  302. (use-package evil-numbers
  303. :general
  304. (:states '(normal motion)
  305. "+" 'evil-numbers/inc-at-pt
  306. "-" 'evil-numbers/dec-at-pt))
  307. ;;;;;; Evil-escape
  308. (use-package evil-escape
  309. :config
  310. (evil-escape-mode t)
  311. (setq-default evil-escape-key-sequence "ii"
  312. evil-escape-delay 0.2))
  313. ;;;;;; Evil-commentary
  314. (use-package evil-commentary
  315. :demand
  316. :config
  317. (evil-commentary-mode t)
  318. :general
  319. (:states 'normal
  320. "gcc" 'evil-commentary-line))
  321. ;;;;;; Evil-surround
  322. (use-package evil-surround
  323. :config
  324. (global-evil-surround-mode))
  325. ;;;;;; Evil-lion
  326. (use-package evil-lion
  327. :general
  328. (spcleader
  329. "a" 'evil-lion-left
  330. "A" 'evil-lion-right))
  331. ;;;;; Which-key
  332. (use-package which-key
  333. :config
  334. (which-key-mode t)
  335. (setq which-key-allow-evil-operators t))
  336. ;;;; Basics
  337. ;;;;; Built-in
  338. ;;;;;; Package
  339. (use-package package
  340. :general
  341. (:keymaps 'package-menu-mode-map
  342. :states 'normal
  343. "q" 'kill-buffer-and-window
  344. "x" 'package-menu-execute))
  345. ;;;;;; Custom
  346. (use-package cus-edit
  347. :ensure nil
  348. :config
  349. (add-to-list 'evil-emacs-state-modes 'Custom-mode))
  350. ;;;;;; Ediff
  351. (use-package ediff
  352. :config
  353. (setq ediff-merge-split-window-function 'split-window-vertically
  354. ediff-window-setup-function 'ediff-setup-windows-plain)
  355. (add-to-list 'evil-emacs-state-modes 'ediff-mode))
  356. ;;;;;; Debugger
  357. (use-package debug
  358. :demand
  359. :config
  360. (add-to-list 'evil-emacs-state-modes 'debugger-mode))
  361. ;;;;;; Paren
  362. (use-package paren
  363. :config
  364. (show-paren-mode t)
  365. (setq show-paren-delay 0))
  366. ;;;;;; Flyspell
  367. (use-package flyspell
  368. :general
  369. (spcleader
  370. "s" '(:ignore t :which-key "Flyspell")
  371. "ss" 'flyspell-goto-next-error
  372. "sd" 'flyspell-check-previous-highlighted-word
  373. "sc" 'ispell-word
  374. "sf" '((lambda () (interactive) (ispell-change-dictionary "francais") (flyspell-buffer)) :which-key "Switch to French")
  375. "sa" '((lambda () (interactive) (ispell-change-dictionary "american") (flyspell-buffer)) :which-key "Switch to American"))
  376. (:states 'insert
  377. "C-s" 'flyspell-check-previous-highlighted-word)
  378. :hook (prog-mode . flyspell-prog-mode))
  379. ;;;;;; Tar-mode
  380. (use-package tar-mode
  381. :general
  382. (:keymaps 'tar-mode-map
  383. :states 'normal
  384. "RET" 'tar-extract-other-window))
  385. ;;;;;; Whitespace
  386. (use-package whitespace
  387. :config
  388. (setq whitespace-style
  389. '(face
  390. tabs
  391. spaces
  392. trailing
  393. empty
  394. space-mark
  395. tab-mark
  396. ))
  397. :hook (before-save . whitespace-cleanup))
  398. ;;;;;; Info
  399. (use-package info
  400. :general
  401. (:keymaps 'Info-mode-map
  402. :states 'normal
  403. "ð" 'Info-backward-node
  404. "ß" 'Info-forward-node
  405. "Þ" 'Info-up
  406. "þ" 'Info-up
  407. "q" 'Info-exit
  408. "ẞ" 'Info-next
  409. "Ð" 'Info-prev
  410. "gr" 'Info-history-forward
  411. "gt" 'Info-history-back
  412. "gg" 'evil-goto-first-line
  413. "s" 'evil-next-visual-line
  414. "d" 'evil-previous-visual-line))
  415. ;;;;;; Highlight line
  416. (use-package hl-line
  417. :config
  418. (global-hl-line-mode t)
  419. :custom-face
  420. (hl-line ((t (:background "gray10")))))
  421. ;;;;;; Simple
  422. (use-package simple
  423. :ensure nil
  424. :config
  425. (global-visual-line-mode t)
  426. :custom-face
  427. (italic ((t (:family "Fira Code Italic"
  428. :foundry "Fira Code Italic")))))
  429. ;;;;;; Revert
  430. (use-package autorevert
  431. :config
  432. (global-auto-revert-mode t))
  433. ;;;;;; Elisp
  434. (use-package elisp-mode
  435. :ensure nil
  436. :config
  437. ;; No size limit to output in elisp mode
  438. (setq eval-expression-print-length nil)
  439. :general
  440. (:keymaps 'emacs-lisp-mode-map
  441. :states 'normal
  442. "RET" 'eval-defun)
  443. (:keymaps 'emacs-lisp-mode-map
  444. :states 'insert
  445. [(control return)] 'eval-print-last-sexp)
  446. (:keymaps 'emacs-lisp-mode-map
  447. :states 'visual
  448. "RET" '(lambda (start end)
  449. (interactive "r")
  450. (eval-region start end t))))
  451. ;;;;;; Help
  452. (use-package help-mode
  453. :ensure nil
  454. :config
  455. (add-to-list 'display-buffer-alist '("*Help*"
  456. (display-buffer-reuse-window display-buffer-in-side-window)
  457. (side . left)
  458. (window-width . 80)
  459. (reusable-frames . nil)))
  460. :general
  461. (spcleader
  462. "h" '(:ignore t :which-key "Help")
  463. "hh" 'help-for-help
  464. "ha" 'apropos-command
  465. "hb" 'counsel-descbinds
  466. "hv" 'counsel-describe-variable
  467. "hf" 'counsel-describe-function
  468. "ho" 'helpful-at-point
  469. "hm" 'describe-mode
  470. "hp" 'finder-by-keyword
  471. "hP" 'describe-package
  472. "hk" 'helpful-key
  473. "hK" 'Info-goto-emacs-key-command-node
  474. "hi" 'info
  475. "hF" 'counsel-faces
  476. "hc" 'counsel-colors-emacs
  477. "hL" 'describe-language-environment)
  478. (:keymaps 'help-mode-map
  479. :states 'normal
  480. "TAB" 'forward-button
  481. "q" 'kill-buffer-and-window
  482. "P" 'help-go-back
  483. "N" 'help-go-forward)
  484. :hook (help-mode . (lambda ()
  485. (setq buffer-face-mode-face '(:background "#102030"))
  486. (buffer-face-mode 1))))
  487. ;;;;;; Markdown
  488. (use-package markdown-mode
  489. :config
  490. (setq markdown-asymmetric-header t)
  491. :custom-face
  492. (markdown-header-face-1 ((t (:inherit 'outline-1))))
  493. (markdown-header-face-2 ((t (:inherit 'outline-2))))
  494. (markdown-header-face-3 ((t (:inherit 'outline-3))))
  495. (markdown-header-face-4 ((t (:inherit 'outline-4))))
  496. (markdown-header-face-5 ((t (:inherit 'outline-5))))
  497. (markdown-bold-face ((t (:foreground "#ede0ce"))))
  498. (markdown-italic-face ((t (:foreground "#ede0ce"))))
  499. (markdown-header-delimiter-face ((t (:foreground "gray30")))))
  500. ;;;;;; Eshell
  501. (defun maxx/eshell-keys ()
  502. "Eshell-mode-map is not populated outside of eshell.
  503. So we need to define bindings in a hook."
  504. (evil-define-key*
  505. 'insert
  506. eshell-mode-map
  507. "ð" 'eshell-previous-matching-input-from-input
  508. "ß" 'eshell-next-matching-input-from-input
  509. "þ" 'eshell-backward-argument
  510. "®" 'eshell-forward-argument
  511. "Þ" 'eshell-kill-input
  512. "Ð" 'eshell-previous-prompt
  513. "ẞ" 'eshell-next-prompt
  514. "C-l" 'eshell/clear)
  515. )
  516. (use-package eshell
  517. :config
  518. (setq eshell-scroll-to-bottom-on-input t)
  519. (add-to-list 'evil-insert-state-modes 'eshell-mode)
  520. :hook (eshell-first-time-mode . maxx/eshell-keys))
  521. ;;;;;; Zoom
  522. (use-package face-remap
  523. :config
  524. (defhydra hydra-zoom (:color red)
  525. "Zoom"
  526. ("+" text-scale-increase)
  527. ("-" text-scale-decrease)
  528. ("/" (text-scale-adjust 0) "Reset"))
  529. :general
  530. (:states 'normal
  531. "C-+" 'hydra-zoom/text-scale-increase
  532. "C--" 'hydra-zoom/text-scale-decrease
  533. "C-/" '(lambda () (interactive) (text-scale-adjust 0))))
  534. ;;;;;; Calc
  535. (use-package calc
  536. :config
  537. (add-to-list 'evil-emacs-state-modes 'calc-mode))
  538. ;;;;;; Calendar
  539. (use-package calendar
  540. :config
  541. (calendar-set-date-style 'iso)
  542. (setq holiday-french-holidays
  543. `((holiday-fixed 1 1 "Jour de l'an")
  544. (holiday-fixed 1 6 "Épiphanie")
  545. (holiday-fixed 2 2 "Chandeleur")
  546. (holiday-fixed 2 14 "Saint Valentin")
  547. (holiday-fixed 5 1 "Fête du travail")
  548. (holiday-fixed 5 8 "Commémoration de la capitulation de l'Allemagne en 1945")
  549. (holiday-fixed 6 21 "Fête de la musique")
  550. (holiday-fixed 7 14 "Fête nationale - Prise de la Bastille")
  551. (holiday-fixed 8 15 "Assomption (Religieux)")
  552. (holiday-fixed 11 11 "Armistice de 1918")
  553. (holiday-fixed 11 1 "Toussaint")
  554. (holiday-fixed 11 2 "Commémoration des fidèles défunts")
  555. (holiday-fixed 12 25 "Noël")
  556. ;; fetes a date variable
  557. (holiday-easter-etc 0 "Pâques")
  558. (holiday-easter-etc 1 "Lundi de Pâques")
  559. (holiday-easter-etc 39 "Ascension")
  560. (holiday-easter-etc 49 "Pentecôte")
  561. (holiday-easter-etc -47 "Mardi gras")
  562. (holiday-float 5 0 4 "Fête des mères")
  563. (holiday-float 6 0 3 "Fête des pères")))
  564. (setq calendar-week-start-day 1
  565. calendar-holidays holiday-french-holidays
  566. calendar-mark-holidays-flag t
  567. calendar-mark-diary-entries-flag t
  568. calendar-view-diary-initially-flag t
  569. calendar-view-holidays-initially-flag t
  570. calendar-left-margin 4)
  571. (add-to-list 'display-buffer-alist '("^\\*Calendar\\*"
  572. (display-buffer-reuse-window display-buffer-in-side-window)
  573. (side . top)
  574. (window-height . 12)
  575. (reusable-frames . nil)))
  576. :general
  577. (:keymaps 'calendar-mode-map
  578. :states 'normal
  579. "q" 'calendar-exit
  580. "RET" 'diary-view-entries
  581. "ð" 'calendar-backward-week
  582. "ß" 'calendar-forward-week
  583. "þ" 'calendar-backward-day
  584. "®" 'calendar-forward-day
  585. "Þ" '(lambda ()
  586. (interactive)
  587. (calendar-backward-month 1)
  588. (calendar-scroll-right))
  589. "™" '(lambda ()
  590. (interactive)
  591. (calendar-forward-month 1)
  592. (calendar-scroll-left))
  593. "Ð" 'calendar-backward-year
  594. "ẞ" 'calendar-forward-year
  595. "T" 'calendar-goto-today
  596. "D" 'calendar-goto-date))
  597. ;;;;;; Diary
  598. (defun maxx/import-caldav (calendar &optional append)
  599. "Import caldav calendar synced on disk with vdirsyncer into the diary.
  600. CALENDAR is the name of the calendar to import from
  601. APPEND is whether to add new events to the diary or to reset it"
  602. (unless append
  603. (delete-file diary-file))
  604. (let* ((caldir (concat "~/Mail/Calendars/" calendar))
  605. (calfiles (directory-files-recursively caldir "\.ics$")))
  606. (seq-do (lambda (entry) (icalendar-import-file entry diary-file))
  607. calfiles)))
  608. (use-package diary-lib
  609. :config
  610. (setq diary-number-of-entries 7
  611. diary-file "~/Projects/diary")
  612. (add-to-list 'display-buffer-alist '("\\*Holidays\\*"
  613. (display-buffer-reuse-window display-buffer-in-side-window)
  614. (side . top)
  615. (slot . 1)
  616. (window-height . 12)
  617. (reusable-frames . nil)))
  618. (add-to-list 'display-buffer-alist '("\\*Fancy Diary Entries\\*"
  619. (display-buffer-reuse-window display-buffer-in-side-window)
  620. (side . top)
  621. (slot . -1)
  622. (window-height . 12)
  623. (reusable-frames . nil)))
  624. :hook (diary-list-entries . diary-sort-entries)
  625. :custom-face
  626. (diary ((t (:foreground "black" :background "limegreen"))))
  627. (org-agenda-diary ((t (:foreground "DarkTurquoise")))))
  628. ;;;;;; Winner
  629. (use-package winner
  630. :demand
  631. :config
  632. (winner-mode 1)
  633. :general
  634. ("C-c u" 'winner-undo
  635. "C-c r" 'winner-redo))
  636. ;;;;;; Dired
  637. (use-package dired
  638. :ensure nil
  639. :config
  640. (setq wdired-allow-to-change-permissions t)
  641. :general
  642. (:keymaps 'dired-mode-map
  643. :states 'normal
  644. "d" 'dired-previous-line
  645. "s" 'dired-next-line
  646. "S" 'dired-sort-toggle-or-edit
  647. "t" 'dired-up-directory
  648. "r" 'dired-find-alternate-file
  649. "m" 'dired-mark
  650. "RET" 'dired-find-alternate-file
  651. "X" 'dired-do-flagged-delete
  652. "x" 'dired-flag-file-deletion
  653. "W" 'wdired-change-to-wdired-mode
  654. "q" 'kill-buffer-and-window)
  655. :hook (dired-mode . all-the-icons-dired-mode))
  656. ;;;;;; Tramp
  657. (use-package tramp
  658. :config
  659. (setq tramp-terminal-type "tramp"
  660. tramp-default-method "sshx"))
  661. ;;;;;; Subword
  662. (use-package subword
  663. :config
  664. ;; Word commands understand camelCase
  665. (global-subword-mode))
  666. ;;;;;; Hideshow
  667. (use-package hideshow
  668. :hook (prog-mode . hs-minor-mode))
  669. ;;;;;; Minibuffer
  670. (use-package minibuffer
  671. :ensure nil
  672. :general
  673. (:keymaps 'read-expression-map
  674. "ð" 'previous-line-or-history-element
  675. "ß" 'next-line-or-history-element))
  676. ;;;;; Undo-tree
  677. (use-package undo-tree
  678. :demand
  679. :config
  680. (global-undo-tree-mode)
  681. (setq undo-tree-auto-save-history t
  682. undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo"))
  683. undo-tree-enable-undo-in-region nil)
  684. (add-to-list 'display-buffer-alist '("*undo-tree"
  685. (display-buffer-reuse-window display-buffer-in-side-window)
  686. (side . left)
  687. (window-width . 0.15)
  688. (reusable-frames . nil)))
  689. :general
  690. (spcleader
  691. "u" 'undo-tree-visualize)
  692. (:keymaps 'undo-tree-visualizer-mode-map
  693. :states 'normal
  694. "q" 'undo-tree-visualizer-quit
  695. "SPC u" 'undo-tree-visualizer-quit
  696. "d" 'undo-tree-visualize-undo
  697. "s" 'undo-tree-visualize-redo
  698. "D" 'undo-tree-visualizer-toggle-diff))
  699. ;;;;; Avy
  700. (use-package avy
  701. :config
  702. (setq avy-keys '(?t ?s ?r ?n)
  703. avy-background t
  704. avy-highlight-first t)
  705. :general
  706. (spcleader
  707. "SPC" '(avy-goto-char-timer :which-key "Avy"))
  708. :custom-face
  709. (avy-goto-char-timer-face ((t (:background nil :foreground "red2" :weight bold))))
  710. (avy-lead-face ((t (:background nil :foreground "red1"))))
  711. (avy-lead-face-0 ((t (:background nil :foreground "red4"))))
  712. (avy-lead-face-1 ((t (:background nil :foreground "red4"))))
  713. (avy-lead-face-2 ((t (:background nil :foreground "red4")))))
  714. ;;;;; Ace-link
  715. (use-package ace-link
  716. :general
  717. (:keymaps '(Info-mode-map
  718. help-mode-map
  719. helpful-mode-map
  720. mu4e-view-mode-map
  721. org-mode-map)
  722. :states 'normal
  723. "f" 'ace-link))
  724. ;;;;; All the icons
  725. (use-package all-the-icons-ivy-rich
  726. :config
  727. (all-the-icons-ivy-rich-mode))
  728. (use-package all-the-icons-dired
  729. :config
  730. (all-the-icons-dired-mode))
  731. ;;;;; Doom
  732. ;;;;;; Doom theme
  733. (use-package doom-themes
  734. :config
  735. (load-theme 'doom-peacock t)
  736. (setq doom-themes-enable-bold t
  737. doom-themes-enable-italic t)
  738. (doom-themes-visual-bell-config))
  739. ;;;;;; Doom modeline
  740. (use-package doom-modeline
  741. :config
  742. (setq doom-modeline-enable-word-count t
  743. doom-modeline-icon t)
  744. ;; first time run M-x all-the-icons-install-fonts
  745. :hook (after-init . doom-modeline-mode))
  746. ;;;;; Expand region
  747. (use-package expand-region
  748. :config
  749. (defhydra hydra-expand-region (:color red)
  750. "Expand-region"
  751. ("e" er/expand-region)
  752. ("E" er/contract-region))
  753. :general
  754. (spcleader
  755. "e" 'hydra-expand-region/er/expand-region
  756. "E" 'hydra-expand-region/er/contract-region))
  757. ;;;;; Autopairs
  758. (use-package autopair
  759. :config
  760. (autopair-global-mode))
  761. ;;;;; Minions
  762. (use-package minions
  763. :config
  764. (minions-mode t)
  765. (setq minions-mode-line-lighter ""))
  766. ;;;;; Helpful
  767. (use-package helpful
  768. :demand
  769. :config
  770. ;; Use helpful as backend for counsel describe
  771. (setq counsel-describe-function-function 'helpful-callable
  772. counsel-describe-variable-function 'helpful-variable
  773. ;; use only one buffer for help
  774. helpful-max-buffers 1)
  775. (add-to-list 'display-buffer-alist '("^\\*helpful"
  776. (display-buffer-reuse-window display-buffer-in-side-window)
  777. (side . left)
  778. (window-width . 80)
  779. (reusable-frames . nil)))
  780. :general
  781. (:keymaps 'helpful-mode-map
  782. :states 'normal
  783. "TAB" 'forward-button
  784. "q" 'kill-buffer-and-window)
  785. :hook (helpful-mode . (lambda ()
  786. (setq buffer-face-mode-face '(:background "#102030"))
  787. (buffer-face-mode 1)))
  788. :custom-face
  789. (helpful-heading ((t (:height 1.9)))))
  790. ;;;;; Fira Code
  791. (use-package fira-code
  792. :load-path "~/.emacs.d/Fira-code"
  793. :hook (prog-mode . fira-code-mode)
  794. (org-mode . fira-code-mode))
  795. ;;;;; Rainbow mode
  796. (use-package rainbow-mode
  797. :demand
  798. :config
  799. (rainbow-mode))
  800. ;;;;; Doc view
  801. (use-package doc-view
  802. :config
  803. (setq doc-view-continuous t
  804. doc-view-resolution 300)
  805. :general
  806. (:keymaps 'doc-view-mode-map
  807. :states 'normal
  808. "d" 'doc-view-previous-line-or-previous-page
  809. "s" 'doc-view-next-line-or-next-page
  810. "ð" 'doc-view-previous-page
  811. "ß" 'doc-view-next-page
  812. "gg" 'doc-view-first-page
  813. "G" 'doc-view-last-page
  814. "q" 'image-kill-buffer
  815. "+" 'doc-view-enlarge
  816. "-" 'doc-view-shrink))
  817. ;;;;; Image Mode
  818. (use-package image
  819. :ensure nil
  820. :config
  821. (setq image-animate-loop t)
  822. :general
  823. (:keymaps 'image-mode-map
  824. :states 'normal
  825. "d" '(lambda () (interactive) (image-scroll-down 1))
  826. "s" '(lambda () (interactive) (image-scroll-up 1))
  827. "t" '(lambda () (interactive) (image-scroll-right 1))
  828. "r" '(lambda () (interactive) (image-scroll-left 1))
  829. "+" 'image-increase-size
  830. "-" 'image-decrease-size
  831. "{" 'image-decrease-speed
  832. "}" 'image-increase-speed
  833. "," 'image-previous-frame
  834. "." 'image-next-frame
  835. "RET" 'image-toggle-animation
  836. "l" 'image-rotate
  837. "v" '(lambda () (interactive) (image-transform-set-rotation (- image-transform-rotation 90)))
  838. "q" 'kill-buffer-and-window))
  839. ;;;;; Woman
  840. (use-package woman
  841. :general
  842. (:keymaps 'woman-mode-map
  843. :states 'normal
  844. "ß" 'Man-next-section
  845. "ð" 'Man-previous-section
  846. "q" 'kill-buffer-and-window))
  847. ;;;; Completion
  848. ;;;;; Ivy
  849. ;;;;;; Ivy
  850. (use-package ivy
  851. :config
  852. ;; Start with empty regex for describe function and variable
  853. (setf (alist-get 'counsel-describe-function ivy-initial-inputs-alist) ""
  854. (alist-get 'org-refile ivy-initial-inputs-alist) ""
  855. (alist-get 'counsel-describe-variable ivy-initial-inputs-alist) ""
  856. (alist-get 'org-capture-refile ivy-initial-inputs-alist) "")
  857. (setq ivy-wrap t
  858. ivy-height 15
  859. ivy-use-virtual-buffers t
  860. ivy-count-format "(%d/%d) "
  861. ivy-extra-directories nil
  862. ivy-re-builders-alist '((t . ivy--regex-ignore-order))
  863. ivy-switch-buffer-faces-alist '((dired-mode . ivy-subdir)))
  864. ;; Use ivy as completion everywhere
  865. (setq completing-read-function 'ivy-completing-read)
  866. :general
  867. (:keymaps '(ivy-mode-map ivy-minibuffer-map)
  868. "ð" 'ivy-previous-line
  869. "ß" 'ivy-next-line
  870. "ẞ" '(lambda ()
  871. (interactive)
  872. (scroll-other-window 1))
  873. "Ð" '(lambda ()
  874. (interactive)
  875. (scroll-other-window -1))
  876. "®" 'ivy-partial-or-done
  877. "þ" '(lambda ()
  878. (interactive)
  879. (kill-buffer (ivy-state-current ivy-last)))
  880. "†" 'maxx/counsel-describe))
  881. ;;;;;; Counsel
  882. (use-package smex
  883. :init
  884. (setq smex-history-length 15))
  885. (use-package counsel
  886. :config
  887. (setq counsel-yank-pop-preselect-last t)
  888. :general
  889. (spcleader
  890. "i" 'counsel-imenu
  891. "f" 'counsel-find-file
  892. "b" 'counsel-switch-buffer
  893. "x" 'counsel-M-x
  894. "/" 'counsel-grep-or-swiper)
  895. ("M-x" 'counsel-M-x)
  896. (:states '(normal motion)
  897. ":" 'counsel-M-x))
  898. (defun maxx/counsel-describe ()
  899. "Display help for object at point in counsel."
  900. (interactive)
  901. (let ((inhibit-message t)
  902. (object (intern (ivy-state-current ivy-last))))
  903. (describe-symbol object)))
  904. ;;;;;; Ivy-rich
  905. (use-package ivy-rich
  906. :config
  907. (plist-put ivy-rich-display-transformers-list
  908. 'counsel-switch-buffer
  909. '(:columns ((ivy-rich-candidate (:width 30))
  910. (ivy-rich-switch-buffer-size (:width 7))
  911. (ivy-rich-switch-buffer-indicators (:width 4 :face error :align right))
  912. (ivy-rich-switch-buffer-major-mode (:width 12 :face warning))
  913. (ivy-rich-switch-buffer-project (:width 15 :face success))
  914. (ivy-rich-switch-buffer-path (:width (lambda (x) (ivy-rich-switch-buffer-shorten-path x (ivy-rich-minibuffer-width 0.3))))))
  915. :predicate (lambda (cand) (get-buffer cand))))
  916. (ivy-rich-mode 1))
  917. ;;;;; Company
  918. (use-package company
  919. :demand
  920. :config
  921. (global-company-mode t)
  922. (setq company-idle-delay 0
  923. tab-always-indent 'complete
  924. company-selection-wrap-around t
  925. company-dabbrev-downcase nil
  926. company-dabbrev-ignore-case nil
  927. company-dabbrev-code-ignore-case t
  928. company-tooltip-align-annotations t
  929. company-minimum-prefix-length 2)
  930. :general
  931. (:states 'insert
  932. "TAB" 'company-indent-or-complete-common)
  933. (:keymaps 'company-active-map
  934. "ß" 'company-select-next
  935. "ð" 'company-select-previous
  936. "Ð" 'company-previous-page
  937. "ẞ" 'company-next-page
  938. "þ" 'company-abort
  939. "®" 'company-complete
  940. "†" 'company-show-doc-buffer))
  941. ;;;; Org
  942. ;;;;; Org
  943. (use-package org
  944. :demand
  945. :config
  946. ;; Supported languages in babel
  947. (org-babel-do-load-languages
  948. 'org-babel-load-languages
  949. '((python . t)
  950. (R . t)
  951. (emacs-lisp . t)
  952. (shell . t)))
  953. (setq org-catch-invisible-edits 'smart
  954. ;; Folders
  955. org-directory "~/Projects/org"
  956. org-agenda-files (directory-files-recursively "~/Projects/org" "\.org$")
  957. org-default-notes-file "~/Projects/org/notes.org"
  958. org-archive-location "::* Archived"
  959. ;; Move Attachments
  960. org-attach-method 'mv
  961. ;; Startup
  962. org-startup-folded 'content
  963. org-startup-with-inline-images t
  964. org-startup-indented t
  965. org-startup-truncated t
  966. org-hide-emphasis-markers t
  967. org-hide-block-startup t
  968. ;; Org sub/superscript behavior
  969. org-use-sub-superscripts '{}
  970. org-export-with-sub-superscripts '{}
  971. org-pretty-entities t
  972. org-pretty-entities-include-sub-superscripts t
  973. ;; RET behavior
  974. org-M-RET-may-split-line nil
  975. org-return-follows-link nil
  976. org-image-actual-width 100
  977. ;; Generate UUIDs for links when storing link
  978. org-id-link-to-org-use-id t
  979. ;; Make todos dependent
  980. org-html-checkbox-type 'unicode
  981. org-enforce-todo-checkbox-dependencies nil
  982. org-enforce-todo-dependencies t
  983. ;; Log states
  984. org-log-into-drawer t
  985. ;; Recursive todo statistics
  986. org-hierarchical-todo-statistics nil
  987. ;; Todo keywords
  988. org-todo-keywords '((sequence "REFILE(r)" "SOMEDAY(s)" "TODO(t)" "WAITING(w!)" "|" "DONE(d!)" "CANCELED(c@)"))
  989. ;; Colors for TODOS
  990. org-todo-keyword-faces
  991. '(("REFILE" . "red4")
  992. ("TODO" . "red")
  993. ("WAITING" . "orange")
  994. ("CANCELED" . (:strike-through t :foreground "DimGrey" :weight bold)))
  995. ;; Do not create a TOC
  996. org-export-with-toc nil
  997. ;; Do not number sections
  998. org-export-with-section-numbers nil
  999. ;; Respect line breaks in exports
  1000. org-export-preserve-breaks t
  1001. ;; REFILE
  1002. org-refile-targets '((nil :maxlevel . 9)
  1003. (org-agenda-files :maxlevel . 9))
  1004. org-refile-use-outline-path 'full-file-path
  1005. org-outline-path-complete-in-steps nil
  1006. )
  1007. ;;;;;; Capture templates
  1008. (setq org-capture-templates
  1009. '(("t"
  1010. "todo"
  1011. entry (file+headline org-default-notes-file "Tasks")
  1012. "* REFILE %^{todo}\n %? \n %a")
  1013. ("n"
  1014. "note"
  1015. entry (file+headline org-default-notes-file "Notes")
  1016. "* %^{title}\n %?")))
  1017. ;; Org windows
  1018. (add-to-list 'display-buffer-alist '("*Org Agenda*"
  1019. (display-buffer-reuse-window display-buffer-in-side-window)
  1020. (side . right)
  1021. (window-width . 80)
  1022. (reusable-frames . nil)))
  1023. ;; ;; Allow emphasis markup in the middle of words
  1024. ;; (setcar org-emphasis-regexp-components " \t('\"{[:alpha:]")
  1025. ;; (setcar (nthcdr 1 org-emphasis-regexp-components) "[:alpha:]- \t.,:!?;'\")}\\")
  1026. ;; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
  1027. ;; Strike-through for checked boxes
  1028. (defface org-checkbox-done-text
  1029. '((t (:foreground "DimGrey" :strike-through t)))
  1030. "Face for text of checked boxes")
  1031. (font-lock-add-keywords
  1032. 'org-mode
  1033. `(("^[ \t]*\\(?:[-+*]\\|[0-9]+[).]\\)[ \t]+\\(\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\(?:X\\|\\([0-9]+\\)/\\2\\)\\][^\n]*\n\\)"
  1034. 1 'org-checkbox-done-text prepend))
  1035. 'append)
  1036. ;; Use Zathura for PDFs
  1037. (if (equal (system-name) "hegp-laptop")
  1038. (setq org-file-apps '((auto-mode . emacs)
  1039. ("\\.mm\\'" . default)
  1040. ("\\.x?html?\\'" . default)
  1041. ("\\.pdf\\'" . "xournalpp %s")
  1042. ("\\.odt\\'" . "libreoffice %s")))
  1043. (setq org-file-apps '((auto-mode . emacs)
  1044. ("\\.mm\\'" . default)
  1045. ("\\.x?html?\\'" . default)
  1046. ("\\.pdf\\'" . "zathura %s"))))
  1047. ;; Menu keybindings
  1048. :general
  1049. (spcleader
  1050. "o" '(:ignore t :which-key "Org")
  1051. "oO" 'projectorg/go-to-inbox
  1052. "oo" 'projectorg/go-to-notes
  1053. "oa" 'org-agenda
  1054. "oc" 'counsel-projectile-org-capture
  1055. "ol" 'org-insert-link
  1056. "oL" 'org-store-link
  1057. "oi" 'org-toggle-inline-images
  1058. "oS" 'org-sort
  1059. "o*" 'org-toggle-heading
  1060. "o/" 'org-sparse-tree
  1061. "o|" 'org-table-create-or-convert-from-region
  1062. "oe" 'org-table-edit-field
  1063. "oE" 'org-export-dispatch
  1064. "o}" 'org-table-toggle-coordinate-overlays
  1065. "o{" 'org-table-toggle-formula-debugger
  1066. "o?" 'org-table-field-info
  1067. "o=" 'org-table-eval-formula
  1068. "oD" 'org-insert-drawer
  1069. "ot" 'org-todo
  1070. "op" 'org-set-property
  1071. "oC" 'org-columns
  1072. "of" 'org-footnote-action
  1073. "oj" 'org-attach
  1074. "ow" 'org-refile
  1075. "oz" 'org-archive-subtree
  1076. "o." 'org-time-stamp
  1077. "os" 'org-schedule
  1078. "od" 'org-deadline
  1079. "o." 'org-time-stamp
  1080. "ob" 'org-ref-helm-insert-cite-link
  1081. "ok" '(lambda () (interactive) (kill-matching-buffers "\.org$" nil t)))
  1082. ;; Normal keybindings
  1083. (:keymaps 'org-mode-map
  1084. :states 'normal
  1085. "RET" 'org-open-at-point
  1086. "gt" 'org-mark-ring-goto
  1087. "U" 'undo-tree-redo
  1088. "<tab>" 'org-cycle
  1089. "S-<tab>" 'org-global-cycle
  1090. "M-s" 'org-metadown
  1091. "M-d" 'org-metaup
  1092. "M-r" 'org-metaright
  1093. "M-t" 'org-metaleft
  1094. "M-S" 'org-shiftmetadown
  1095. "M-D" 'org-shiftmetaup
  1096. "M-R" 'org-shiftmetaright
  1097. "M-T" 'org-shiftmetaleft
  1098. "C-s" 'org-shiftdown
  1099. "C-d" 'org-shiftup
  1100. "C-r" 'org-shiftright
  1101. "C-t" 'org-shiftleft
  1102. "©" 'org-babel-next-src-block
  1103. "ſ" 'org-babel-previous-src-block)
  1104. ;; Insert keybindings
  1105. (:keymaps 'org-mode-map
  1106. :states '(normal insert)
  1107. "Þ" 'outline-up-heading
  1108. "Ð" 'outline-backward-same-level
  1109. "ẞ" 'outline-forward-same-level
  1110. "þ" 'outshine-kbd-M-<left>
  1111. "®" 'outshine-kbd-M-<right>
  1112. "ð" 'org-previous-visible-heading
  1113. "ß" 'org-next-visible-heading)
  1114. ;; Pretty checkboxes
  1115. :hook (org-mode . (lambda ()
  1116. (push '("[ ]" . "☐") prettify-symbols-alist)
  1117. (push '("[X]" . "☑" ) prettify-symbols-alist)
  1118. (push '("[-]" . "☒" ) prettify-symbols-alist)
  1119. (setq-local prettify-symbols-unprettify-at-point 'right-edge)
  1120. (prettify-symbols-mode)))
  1121. :custom-face
  1122. (highlight ((t (:background nil :foreground nil :box (:line-width 2 :color "dim gray") :DistantForeground nil))))
  1123. (outline-1 ((t (:height 1.9 :background nil))))
  1124. (outline-2 ((t (:height 1.6))))
  1125. (outline-3 ((t (:height 1.4))))
  1126. (outline-4 ((t (:height 1.2))))
  1127. (outline-5 ((t (:height 1.1)))))
  1128. ;;;;; Org Agenda
  1129. (setq org-todo-sort-order '("REFILE" "TODO" "WAITING" "SOMEDAY" "CANCELED" "DONE"))
  1130. (defun maxx/org-agenda-sort-strategy (a b)
  1131. "Sort todo based on which I want to see first"
  1132. (when-let ((state-a (get-text-property 14 'todo-state a))
  1133. (state-b (get-text-property 14 'todo-state b))
  1134. (cmp (--map (cl-position-if (lambda (x)
  1135. (equal x it))
  1136. org-todo-sort-order)
  1137. (list state-a state-b))))
  1138. (cond ((apply '> cmp) 1)
  1139. ((apply '< cmp) -1)
  1140. (t nil))))
  1141. (use-package org-agenda
  1142. :ensure nil
  1143. :config
  1144. (setq
  1145. ;; Hide blocked todos from agenda
  1146. org-agenda-dim-blocked-tasks 'invisible
  1147. ;; Agenda window
  1148. org-agenda-window-setup 'current-window
  1149. org-agenda-restore-windows-after-quit t
  1150. ;; Agenda for 10 days from 1 day before
  1151. org-agenda-span 10
  1152. org-agenda-start-day "-1d"
  1153. org-agenda-include-diary t
  1154. org-agenda-tags-column -78
  1155. org-agenda-start-with-follow-mode t
  1156. org-agenda-todo-ignore-scheduled 'all
  1157. org-agenda-todo-ignore-deadlines 'near
  1158. org-agenda-skip-scheduled-if-done t
  1159. org-agenda-skip-deadline-if-done t
  1160. org-agenda-skip-deadline-prewarning-if-scheduled 3
  1161. org-agenda-cmp-user-defined 'maxx/org-agenda-sort-strategy
  1162. org-agenda-sorting-strategy
  1163. '((agenda time-up deadline-up priority-down)
  1164. (todo user-defined-up priority-down)
  1165. (tags priority-down category-keep)
  1166. (search category-keep))
  1167. )
  1168. ;; Agenda keybindings
  1169. :general
  1170. (:keymaps 'org-agenda-mode-map
  1171. :states '(normal)
  1172. "q" 'org-agenda-quit
  1173. "C-d" 'org-agenda-priority-up
  1174. "C-s" 'org-agenda-priority-down
  1175. "i" 'org-agenda-diary-entry
  1176. "T" 'org-agenda-todo
  1177. "ß" 'org-agenda-next-item
  1178. "ð" 'org-agenda-previous-item
  1179. "RET" 'org-agenda-goto
  1180. "®" 'org-agenda-goto
  1181. "_" 'org-agenda-cycle-show
  1182. "C" 'org-agenda-columns
  1183. "Ð" 'org-agenda-earlier
  1184. "ẞ" 'org-agenda-later))
  1185. ;;;;; Org notifications
  1186. (use-package org-wild-notifier
  1187. :config
  1188. (setq alert-default-style 'libnotify)
  1189. ;; (org-wild-notifier-mode)
  1190. )
  1191. ;;;;; Org-bullets
  1192. (use-package org-bullets
  1193. :config
  1194. (setq org-hide-leading-stars t)
  1195. :hook (org-mode . org-bullets-mode))
  1196. ;;;;; Org fancy priorities
  1197. (use-package org-fancy-priorities
  1198. :config
  1199. ;; Set colors
  1200. (setq org-priority-faces
  1201. '((?A . "#ff5d38")
  1202. (?B . "orange")
  1203. (?C . "#98be65")))
  1204. ;; Set chars
  1205. (setq org-fancy-priorities-list
  1206. '((?A . "⬆")
  1207. (?B . "·")
  1208. (?C . "⬇")))
  1209. :hook (org-mode . org-fancy-priorities-mode))
  1210. ;;;;; Outshine
  1211. (use-package outshine
  1212. :general
  1213. (:keymaps 'outshine-mode-map
  1214. :states 'normal
  1215. "<tab>" 'outshine-cycle
  1216. "S-<tab>" 'outshine-cycle-buffer
  1217. [(control return)] 'outshine-insert-heading
  1218. "ð" 'outline-previous-visible-heading
  1219. "ß" 'outline-next-visible-heading
  1220. "Ð" 'outline-backward-same-level
  1221. "ẞ" 'outline-forward-same-level
  1222. "Þ" 'outline-up-heading
  1223. "þ" 'outshine-kbd-M-<left>
  1224. "®" 'outshine-kbd-M-<right>
  1225. "M-t" 'outshine-kbd-M-S-<left>
  1226. "M-r" 'outshine-kbd-M-S-<right>
  1227. "M-d" 'outshine-kbd-M-S-<up>
  1228. "M-s" 'outshine-kbd-M-S-<down>
  1229. )
  1230. :hook (emacs-lisp-mode . outshine-mode))
  1231. ;;;;; Org-ref
  1232. (use-package org-ref
  1233. :config
  1234. (setq org-ref-bibliography-notes "~/Projects/org/bib_notes.org"
  1235. org-ref-completion-library 'org-ref-ivy-cite
  1236. org-latex-pdf-process '("latexmk -shell-escape -bibtex -f -pdf %f")))
  1237. ;;;;; Poly-org
  1238. ;; (use-package poly-org)
  1239. ;;;;; Org caldav
  1240. (use-package org-caldav
  1241. :config
  1242. (setq org-caldav-url "https://caldav.maximewack.com/maxx"
  1243. org-caldav-inbox "~/Projects/caldav-in.org"
  1244. org-caldav-files '("~/Projects/notes.org")
  1245. org-icalendar-timezone "Europe/Paris"
  1246. org-caldav-sync-direction 'cal->org
  1247. org-caldav-sync-changes-to-org 'all)
  1248. org-caldav-calendars '((:calendar-id "5b0bbb40-8725-3c71-3a3d-8951170cbee7"
  1249. :sync-direction 'cal->org)
  1250. (:calendar-id "94ad67a3-c712-9e0e-f729-96ec23ff9713"
  1251. :sync-direction 'cal->org)
  1252. (:calendar-id "4e3071f2-df7b-0aa4-41f9-f1789d744bd9"
  1253. :inbox "~/Projects/caldav-org.org"
  1254. :files org-agenda-files
  1255. :sync-direction 'org->caldav))
  1256. )
  1257. ;;;; Project management
  1258. ;;;;; Projectile
  1259. (use-package projectile
  1260. :config
  1261. (projectile-clear-known-projects)
  1262. (setq projectile-completion-system 'ivy))
  1263. ;;;;; Projectorg
  1264. (use-package projectorg
  1265. :load-path "~/Projects/projectorg"
  1266. :demand
  1267. :config
  1268. (setq projectorg-projects-root "/home/maxx/Projects/"
  1269. projectorg-org-dir "org/")
  1270. ;; Capture template
  1271. (add-to-list 'org-capture-templates
  1272. `("pp"
  1273. "project"
  1274. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "projects.org") "Projects")
  1275. ,(concat "* [[" projectorg-projects-root projectorg-org-dir "%^{project}.org][%^{project}]]\n")))
  1276. (add-to-list 'org-capture-templates
  1277. `("pc"
  1278. "cours"
  1279. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "projects.org") "Cours")
  1280. ,(concat "* [[" projectorg-projects-root projectorg-org-dir "%^{project}.org][%^{project}]]\n")))
  1281. (add-to-list 'org-capture-templates
  1282. `("pr"
  1283. "requête"
  1284. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "projects.org") "Requêtes")
  1285. ,(concat "* [[" projectorg-projects-root projectorg-org-dir "%^{project}.org][%^{project}]]\n")))
  1286. (add-to-list 'org-capture-templates
  1287. `("po"
  1288. "perso"
  1289. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "projects.org") "Perso")
  1290. ,(concat "* [[" projectorg-projects-root projectorg-org-dir "%^{project}.org][%^{project}]]\n")))
  1291. (add-to-list 'org-capture-templates
  1292. `("pd"
  1293. "divers"
  1294. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "projects.org") "Divers")
  1295. ,(concat "* [[" projectorg-projects-root projectorg-org-dir "%^{project}.org][%^{project}]]\n")))
  1296. (advice-add 'find-file :after 'projectorg/add-to-project-list)
  1297. (advice-add 'find-file-other-window :after 'projectorg/add-to-project-list)
  1298. )
  1299. ;;;;; Counsel-projectile
  1300. (use-package counsel-projectile
  1301. :config
  1302. (setq counsel-projectile-org-capture-templates
  1303. `(("tp"
  1304. "[${name}] Todo"
  1305. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "${name}.org") "Tasks")
  1306. "* TODO %^{todo}\n %? \n %a")
  1307. ("np"
  1308. "[${name}] Note"
  1309. entry (file+headline ,(concat projectorg-projects-root projectorg-org-dir "${name}.org") "Notes")
  1310. "* %^{title} %t\n %?")))
  1311. :general
  1312. (spcleader
  1313. "p" '(:ignore t :which-key "Projectile")
  1314. "pf" 'counsel-projectile-find-file
  1315. "pb" 'counsel-projectile-switch-to-buffer
  1316. "pp" 'counsel-projectile-switch-project
  1317. "pg" 'counsel-projectile-grep
  1318. "pk" 'projectorg/remove-from-project-list
  1319. "p SPC" '(lambda () (interactive) (find-file "~/Projects/org/projects.org"))))
  1320. ;;;;; Skeletor
  1321. (use-package skeletor
  1322. :config
  1323. (setq skeletor-completing-read-function 'ivy-completing-read
  1324. skeletor-user-directory "~/Projects/skeletons"
  1325. skeletor--project-types nil)
  1326. (skeletor-define-template "skel-Requete"
  1327. :title "Requête"
  1328. :no-license? t)
  1329. (skeletor-define-template "skel-Elisp"
  1330. :title "Elisp"))
  1331. ;;;; Jump to definition
  1332. (use-package dumb-jump
  1333. :config
  1334. (setq dumb-jump-selector 'ivy)
  1335. :general
  1336. (spcleader
  1337. "d" 'dumb-jump-go-other-window))
  1338. ;;;; CSV mode
  1339. (use-package csv-mode)
  1340. ;;;; Lua
  1341. ;;;;; Lua-mode
  1342. (use-package lua-mode)
  1343. ;;;;; Company-lua
  1344. (use-package company-lua)
  1345. ;;;; ESS
  1346. ;;;;; ESS
  1347. (use-package ess
  1348. :config
  1349. (setq ess-ask-for-ess-directory nil
  1350. comint-scroll-to-bottom-on-input t
  1351. comint-scroll-to-bottom-on-output t
  1352. ess-use-ido nil
  1353. ess-style 'RStudio
  1354. ess-eldoc-show-on-symbol t)
  1355. (add-to-list 'evil-insert-state-modes 'comint-mode)
  1356. (add-to-list 'display-buffer-alist '("*R Dired"
  1357. (display-buffer-reuse-window display-buffer-in-side-window)
  1358. (side . right)
  1359. (slot . 1)
  1360. (window-width . 0.2)
  1361. (reusable-frames . nil)))
  1362. (add-to-list 'display-buffer-alist '("\\*Help\\[R"
  1363. (display-buffer-reuse-window display-buffer-in-side-window)
  1364. (side . right)
  1365. (window-width . 0.4)
  1366. (reusable-frames . nil)))
  1367. (add-to-list 'display-buffer-alist '("*R"
  1368. (display-buffer-reuse-window display-buffer-in-side-window)
  1369. (window-height . 0.3)
  1370. (reusable-frames . nil)))
  1371. :general
  1372. (spcleader
  1373. "r" '(:ignore t :which-key "R")
  1374. "rh" 'ess-display-help-on-object
  1375. "rH" 'ess-handy-commands
  1376. "rc" 'polymode-eval-region-or-chunk
  1377. "ra" 'polymode-eval-buffer-from-beg-to-point
  1378. "rs" 'ess-switch-process
  1379. "rq" 'ess-quit)
  1380. (:keymaps 'ess-r-mode-map
  1381. :states 'normal
  1382. "RET" 'ess-eval-line-and-step)
  1383. (:keymaps 'ess-r-mode-map
  1384. :states 'visual
  1385. "RET" 'ess-eval-region)
  1386. (:keymaps 'ess-r-mode-map
  1387. :states 'insert
  1388. "»" '(lambda () (interactive) (insert "%>%")))
  1389. (:keymaps 'ess-r-help-mode-map
  1390. :states 'normal
  1391. "q" 'kill-buffer-and-window
  1392. "TAB" 'forward-button
  1393. "ð" 'ess-skip-to-previous-section
  1394. "ß" 'ess-skip-to-next-section)
  1395. (:keymaps 'inferior-ess-r-mode-map
  1396. :states 'insert
  1397. "TAB" 'company-complete
  1398. "C-l" 'comint-clear-buffer
  1399. "þ" 'comint-kill-input
  1400. "ð" 'comint-previous-matching-input-from-input
  1401. "ß" 'comint-next-matching-input-from-input
  1402. "»" '(lambda () (interactive) (insert "%>%")))
  1403. (:keymaps 'inferior-ess-r-mode-map
  1404. :states '(insert normal)
  1405. "C-d" 'evil-scroll-line-up
  1406. "C-s" 'evil-scroll-line-down)
  1407. (:keymaps 'inferior-ess-r-mode-map
  1408. :states 'normal
  1409. "ð" 'comint-previous-prompt
  1410. "ß" 'comint-next-prompt)
  1411. :hook (comint-mode . (lambda () (setq-local scroll-margin 0))))
  1412. ;;;;; Poly-R
  1413. (use-package poly-R
  1414. :general
  1415. (spcleader
  1416. "r" '(:ignore t :which-key "R")
  1417. "rc" 'polymode-eval-region-or-chunk
  1418. "ra" 'polymode-eval-buffer-from-beg-to-point
  1419. "re" 'polymode-export
  1420. "rE" 'polymode-set-exporter)
  1421. (:keymaps '(markdown-mode-map ess-mode-map)
  1422. :states 'normal
  1423. "<tab>" 'markdown-cycle
  1424. "ð" 'markdown-previous-visible-heading
  1425. "ß" 'markdown-next-visible-heading
  1426. "Ð" 'markdown-outline-previous-same-level
  1427. "ẞ" 'markdown-outline-next-same-level
  1428. "þ" 'markdown-hide-subtree
  1429. "®" '(lambda () (interactive)
  1430. (markdown-show-children)
  1431. (markdown-show-entry))
  1432. "Þ" 'markdown-up-heading
  1433. "©" 'polymode-next-chunk
  1434. "ſ" 'polymode-previous-chunk
  1435. "M-r" 'markdown-demote
  1436. "M-t" 'markdown-promote
  1437. "M-d" 'markdown-move-up
  1438. "M-s" 'markdown-move-down))
  1439. ;;;; Git
  1440. ;;;;; Magit
  1441. (use-package magit
  1442. :config
  1443. (setq magit-status-goto-file-position t
  1444. magit-popup-show-help-echo nil)
  1445. (add-to-list 'evil-emacs-state-modes 'magit-mode)
  1446. (add-to-list 'evil-emacs-state-modes 'git-rebase-mode)
  1447. (add-to-list 'display-buffer-alist '("magit"
  1448. (display-buffer-reuse-window display-buffer-in-side-window)
  1449. (side . left)
  1450. (window-width . 80)
  1451. (reusable-frames . nil)))
  1452. (add-to-list 'display-buffer-alist '("magit-diff"
  1453. (display-buffer-reuse-window display-buffer-in-side-window)
  1454. (side . left)
  1455. (slot . 1)
  1456. (window-height . .5)
  1457. (window-width . 80)
  1458. (reusable-frames . nil)))
  1459. :general
  1460. (spcleader
  1461. "g" '(:ignore t :which-key "Magit")
  1462. "gd" 'magit-file-dispatch
  1463. "gs" 'magit-status)
  1464. (:keymaps '(magit-hunk-section-map
  1465. magit-file-section-map
  1466. magit-mode-map
  1467. magit-staged-section-map
  1468. magit-unstaged-section-map
  1469. magit-revision-mode-map
  1470. magit-section-map
  1471. magit-refs-mode-map
  1472. magit-log-mode-map
  1473. magit-diff-mode-map
  1474. magit-untracked-section-map
  1475. magit-status-mode-map
  1476. magit-stash-section-map)
  1477. "ð" 'magit-section-backward
  1478. "ß" 'magit-section-forward
  1479. "þ" 'magit-section-hide
  1480. "®" 'magit-section-show
  1481. "s" 'magit-next-line
  1482. "d" 'magit-previous-line
  1483. "q" 'kill-buffer-and-window)
  1484. (:keymaps '(magit-hunk-section-map
  1485. magit-status-mode-map
  1486. magit-unstaged-section-map
  1487. magit-untracked-section-map)
  1488. "+" 'magit-stage
  1489. "-" 'magit-unstage))
  1490. ;;;;; Magit-annex
  1491. (use-package magit-annex)
  1492. ;;;;; Magit-todos
  1493. (use-package magit-todos
  1494. :config
  1495. (magit-todos-mode))
  1496. ;;;;; Smerge
  1497. (use-package smerge-mode
  1498. :general
  1499. (:keymaps 'smerge-mode-map
  1500. :states 'normal
  1501. "RET" 'smerge-keep-current
  1502. "n" 'smerge-next
  1503. "p" 'smerge-prev))
  1504. ;;;;; Git-gutter-fringe
  1505. (use-package git-gutter-fringe
  1506. :config
  1507. (global-git-gutter-mode t))
  1508. ;;;; Elpy
  1509. (use-package elpy
  1510. :init
  1511. (elpy-enable))
  1512. ;;;; Slime
  1513. (use-package slime
  1514. :config
  1515. (setq inferior-lisp-program "clisp"))
  1516. ;;;; Flycheck
  1517. (use-package flycheck
  1518. :config
  1519. (global-flycheck-mode))
  1520. ;;;; Mu4e
  1521. ;;;;; Mu4e
  1522. (use-package mu4e
  1523. :demand
  1524. :load-path "/usr/share/emacs/site-lisp/mu4e/"
  1525. :config
  1526. (add-to-list 'evil-emacs-state-modes 'mu4e-main-mode)
  1527. ;; Folders
  1528. (setq mu4e-sent-folder "/Inbox"
  1529. mu4e-drafts-folder "/Drafts"
  1530. mu4e-trash-folder "/Trash")
  1531. ;; and their shortcuts
  1532. (setq mu4e-maildir-shortcuts
  1533. '(("/Inbox" . ?i)
  1534. ("/Archives" . ?a)
  1535. ("/Trash" . ?t)
  1536. ("/Junk" . ?j)
  1537. ("/Sent" . ?s)))
  1538. ;; Mail accounts
  1539. (cond ((equal (system-name) "hegp")
  1540. (setq mu4e-get-mail-command "mbsync aphp"
  1541. mu4e-refile-folder "/Local_archive"
  1542. mu4e-maildir-shortcuts
  1543. '(("/Inbox" . ?i)
  1544. ("/Local_archive" . ?a)
  1545. ("/Trash" . ?t)
  1546. ("/Junk" . ?j)
  1547. ("/Sent" . ?s))
  1548. mu4e-compose-signature "Maxime Wack, MD, MSc
  1549. Assistant Hospitalo-Universitaire
  1550. Pôle Informatique et Santé Publique
  1551. Hôpital Européen Georges Pompidou
  1552. tel: 01 56 09 23 63"))
  1553. ((equal (system-name) "laptop")
  1554. (setq mu4e-get-mail-command "mbsync free"
  1555. mu4e-refile-folder "/Archives"
  1556. mu4e-compose-signature "Maxime"))
  1557. ((equal (system-name) "hegp-laptop")
  1558. (setq mu4e-get-mail-command "mbsync free"
  1559. mu4e-refile-folder "/Archives"
  1560. mu4e-compose-signature "Maxime")))
  1561. ;; Options
  1562. (setq mu4e-view-prefer-html t
  1563. mu4e-update-interval 300
  1564. mu4e-headers-auto-update t
  1565. mu4e-compose-signature-auto-include t
  1566. mu4e-compose-format-flowed t
  1567. mu4e-attachment-dir "~/Downloads"
  1568. mu4e-compose-in-new-frame nil
  1569. mu4e-view-show-images t
  1570. mu4e-headers-sort-direction 'ascending
  1571. mu4e-confirm-quit nil
  1572. ;; Required by mbsync
  1573. mu4e-change-filenames-when-moving t
  1574. message-kill-buffer-on-exit t
  1575. mu4e-compose-dont-reply-to-self t
  1576. mu4e-completing-read-function 'ivy-completing-read
  1577. mu4e-split-view 'vertical
  1578. mu4e-headers-visible-columns 110
  1579. mu4e-headers-include-related nil
  1580. mu4e-headers-skip-duplicates t
  1581. mu4e-headers-results-limit 500
  1582. mu4e-index-cleanup t
  1583. mu4e-index-lazy-check nil
  1584. mail-user-agent 'mu4e-user-agent)
  1585. ;; Define headers
  1586. (setq mu4e-headers-fields
  1587. '((:flags . 4)
  1588. (:thread-subject . 50)
  1589. (:size . 6)
  1590. (:from-or-to . 20)
  1591. (:human-date . 15)))
  1592. ;; Use imagemagick to view images, if available
  1593. (when (fboundp 'imagemagick-register-types)
  1594. (imagemagick-register-types))
  1595. ;; Add action to view in browser
  1596. (add-to-list 'mu4e-view-actions
  1597. '("browser" . mu4e-action-view-in-browser) t)
  1598. :general
  1599. (:keymaps 'mu4e-headers-mode-map
  1600. :states 'normal
  1601. "ð" 'mu4e-headers-prev
  1602. "ß" 'mu4e-headers-next
  1603. "RET" 'mu4e-headers-view-message
  1604. "®" 'mu4e-headers-view-message
  1605. "q" 'mu4e~headers-quit-buffer
  1606. "x" 'mu4e-headers-mark-for-trash
  1607. "a" 'mu4e-headers-mark-for-refile
  1608. "u" 'mu4e-headers-mark-for-unmark
  1609. "l" 'mu4e-headers-mark-for-delete
  1610. "U" 'mu4e-mark-unmark-all
  1611. "X" 'mu4e-mark-execute-all
  1612. "W" 'mu4e-headers-toggle-include-related
  1613. "T" 'mu4e-compose-new
  1614. "F" 'mu4e-compose-forward
  1615. "R" 'mu4e-compose-reply
  1616. "m" 'mu4e-update-mail-and-index
  1617. "o" 'mu4e-headers-change-sorting
  1618. "'" 'mu4e~headers-jump-to-maildir
  1619. "M" 'mu4e-headers-mark-for-move)
  1620. (:keymaps 'mu4e-headers-mode-map
  1621. :states 'visual
  1622. "l" 'mu4e-headers-mark-for-delete)
  1623. (:keymaps 'mu4e-view-mode-map
  1624. :states 'normal
  1625. "ð" 'mu4e-view-headers-prev
  1626. "ß" 'mu4e-view-headers-next
  1627. "þ" 'mu4e-select-other-view
  1628. "q" 'mu4e~view-quit-buffer
  1629. "x" 'mu4e-view-mark-for-trash
  1630. "a" 'mu4e-view-mark-for-refile
  1631. "u" 'mu4e-view-mark-for-unmark
  1632. "l" 'mu4e-view-mark-for-delete
  1633. "U" 'mu4e-mark-unmark-all
  1634. "X" 'mu4e-mark-execute-all
  1635. "T" 'mu4e-compose-new
  1636. "F" 'mu4e-compose-forward
  1637. "R" 'mu4e-compose-reply
  1638. "m" 'mu4e-update-mail-and-index
  1639. "'" 'mu4e~headers-jump-to-maildir
  1640. "h" 'mu4e-view-toggle-html
  1641. "M" 'mu4e-view-mark-for-move
  1642. "A" 'mu4e-view-attachment-action))
  1643. ;;;;; Mu4e-alert
  1644. (defun maxx/mu4e-alert-notification-formatter (mail-group all-emails)
  1645. "Define a custom mu4e-alert formatter for MAIL-GROUP notification.
  1646. ALL-EMAILS are all the unread emails"
  1647. (list :title (format "%s \uf0e0" (mu4e-alert--get-group (car mail-group)))
  1648. :body ""))
  1649. (use-package mu4e-alert
  1650. :after alert
  1651. :config
  1652. (mu4e-alert-set-default-style 'libnotify)
  1653. (setq mu4e-alert-email-notification-types '(subjects))
  1654. (setq mu4e-alert-grouped-mail-notification-formatter 'maxx/mu4e-alert-notification-formatter)
  1655. (mu4e-alert-enable-notifications))
  1656. ;;;;; smtpmail
  1657. (use-package smtpmail
  1658. :config
  1659. (setq smtpmail-queue-mail nil
  1660. message-send-mail-function 'smtpmail-send-it
  1661. send-mail-function 'smtpmail-send-it)
  1662. ;; Mail accounts
  1663. (cond ((equal (system-name) "laptop")
  1664. (setq smtpmail-smtp-server "smtp.free.fr"
  1665. user-mail-address "maximewack@free.fr"
  1666. auth-sources '(password-store)))
  1667. ((equal (system-name) "hegp-laptop")
  1668. (setq smtpmail-smtp-server "smtp.free.fr"
  1669. user-mail-address "maximewack@free.fr"
  1670. auth-sources '(password-store)))
  1671. ((equal (system-name) "hegp")
  1672. (setq smtpmail-smtp-server "smtp.aphp.fr"
  1673. user-mail-address "maxime.wack@aphp.fr"
  1674. auth-sources '(password-store)
  1675. smtpmail-smtp-service 25))))
  1676. ;;;;; Org-mime
  1677. (use-package org-mime)
  1678. ;;;;; Org-msg
  1679. (use-package org-msg
  1680. :config
  1681. (org-msg-mode))
  1682. ;;;;; Org-mu4e
  1683. (use-package org-mu4e
  1684. :demand
  1685. :ensure nil
  1686. :config
  1687. (setq org-mu4e-convert-to-html t)
  1688. :hook (mu4e-compose-mode . org-mu4e-compose-org-mode))
  1689. ;;;;; Htmlize
  1690. (use-package htmlize)
  1691. ;;;;; Gnus-dired
  1692. (require 'gnus-dired)
  1693. (defun gnus-dired-mail-buffers ()
  1694. "Return a list of active message buffers."
  1695. (let (buffers)
  1696. (save-current-buffer
  1697. (dolist (buffer (buffer-list t))
  1698. (set-buffer buffer)
  1699. (when (and (derived-mode-p 'message-mode)
  1700. (null message-sent-message-via))
  1701. (push (buffer-name buffer) buffers))))
  1702. (nreverse buffers)))
  1703. (setq gnus-dired-mail-mode 'mu4e-user-agent)
  1704. (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)