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.

1570 lines
43KB

  1. ;;; Use-package
  2. ;; Use package and melpa as source
  3. (require 'package)
  4. (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
  5. (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/"))
  6. (setq package-enable-at-startup nil)
  7. (package-initialize)
  8. ;; use-package
  9. (setq-default
  10. use-package-always-ensure t
  11. use-package-expand-minimally t
  12. use-package-verbose nil
  13. use-package-enable-imenu-support t)
  14. (unless (package-installed-p 'use-package)
  15. (package-refresh-contents)
  16. (package-install 'use-package))
  17. (eval-when-compile (require 'use-package))
  18. ;;; Custom and options
  19. ;;;; Custom file
  20. (setq custom-file "~/dotfiles/.emacs.d/custom.el")
  21. (load custom-file)
  22. ;;;; Options
  23. ;;;;; Mode-line
  24. (setq
  25. ;; Mnemonics for eol
  26. eol-mnemonic-unix "(Unix)"
  27. ;; Display total size of buffer and column index
  28. size-indication-mode t
  29. ;; Column numbers
  30. column-number-mode t
  31. ;; Column numbers from 1
  32. column-number-indicator-zero-based nil)
  33. ;;;;; Backup
  34. (setq
  35. ;; delete excess backup versions silently
  36. delete-old-versions t
  37. ;; make backup files
  38. make-backup-files t
  39. ;; Use version control on backups
  40. version-control t
  41. ;; don't make backups file when in version controlled dir
  42. vc-make-backup-files nil
  43. ;; which directory to put backups file
  44. backup-directory-alist `(("." . "~/.emacs.d/backups")))
  45. ;;;;; Autosave
  46. (setq
  47. ;; Enable
  48. auto-save-default t
  49. ;; Set interval and timeout
  50. auto-save-interval 300
  51. auto-save-timeout 30
  52. ;; Set directory for auto-saves
  53. auto-save-file-name-transforms '((".*" "~/.emacs.d/auto-save/" t)))
  54. ;;;;; Scrolling
  55. (setq
  56. scroll-margin 10
  57. hscroll-margin 10
  58. scroll-conservatively 100000
  59. scroll-preserve-screen-position 1
  60. hscroll-step 1
  61. maximum-scroll-margin 0.5)
  62. ;;;;; Disable GUI
  63. (menu-bar-mode -1)
  64. (tool-bar-mode -1)
  65. (scroll-bar-mode -1)
  66. (blink-cursor-mode -1)
  67. (tooltip-mode -1)
  68. (setq
  69. inhibit-startup-screen t
  70. inhibit-startup-message t
  71. inhibit-startup-echo-area-message t)
  72. ;;;;; UTF8
  73. (setq
  74. coding-system-for-read 'utf-8
  75. coding-system-for-write 'utf-8)
  76. ;; Prefer UTF-8
  77. (prefer-coding-system 'utf-8)
  78. (set-default-coding-systems 'utf-8)
  79. (set-terminal-coding-system 'utf-8)
  80. (set-keyboard-coding-system 'utf-8)
  81. ;;;;; Set proxy at work
  82. (when (equal (system-name) "hegp")
  83. (setq url-proxy-services '(("no_proxy" . "127.0.0.1")
  84. ("http" . "proxym-inter.aphp.fr:8080")
  85. ("https" . "proxym-inter.aphp.fr:8080"))))
  86. ;;;;; Misc
  87. ;; Stop warning when using narrow
  88. (put 'narrow-to-region 'disabled nil)
  89. (setq
  90. fill-column 100
  91. ;; Kill debug windows after use
  92. debugger-bury-or-kill 'kill
  93. ;; Set tramp terminal type
  94. tramp-terminal-type "tramp"
  95. ;; Scroll smoothly with mouse
  96. mouse-wheel-scroll-amount '(2 ((shift) . 1) ((control)))
  97. ;; Indent two spaces
  98. standard-indent 2
  99. ;; don't ask for confirmation when opening symlinked file
  100. vc-follow-symlinks t
  101. ;; silent bell when you make a mistake
  102. ring-bell-function 'ignore
  103. ;; Identity
  104. user-full-name "Maxime Wack"
  105. user-mail-address "maximewack@free.fr"
  106. ;; GC and file size limits
  107. gc-cons-threshold 50000000
  108. large-file-warning-threshold 100000000
  109. ;; Filename in title
  110. frame-title-format
  111. '((:eval (if (buffer-file-name)
  112. (abbreviate-file-name (buffer-file-name))
  113. "%b")))
  114. )
  115. (setq-default
  116. ;; Show empty lines at the end of the buffer
  117. indicate-empty-lines t
  118. ;; Spaces for indent
  119. tab-width 2
  120. ;; Don't use tabs in indentation
  121. indent-tabs-mode nil)
  122. ;; Set transparency
  123. (set-frame-parameter (selected-frame) 'alpha '(85 . 90))
  124. ;; Font
  125. (unless (equal (system-name) "hegp")
  126. (set-frame-font "Fira Code 10" nil t))
  127. ;; Replace yes/no with y/n
  128. (fset 'yes-or-no-p 'y-or-n-p)
  129. ;; Disable package-selected-packages
  130. (defun package--save-selected-packages (&rest opt) nil)
  131. ;;; Packages
  132. ;;;; Keys
  133. ;;;;; General
  134. (use-package general
  135. :demand
  136. :config
  137. (general-create-definer spcleader
  138. :states '(normal visual insert emacs)
  139. :prefix "SPC"
  140. :non-normal-prefix "M-SPC")
  141. (spcleader
  142. "RET" 'eval-defun
  143. "." 'eval-expression
  144. "k" '((lambda () (interactive) (kill-buffer nil)) :which-key "kill buffer")
  145. "K" 'kill-some-buffers
  146. "$" '((lambda () (interactive) (find-file "~/.emacs")) :which-key "open config")
  147. "#" '((lambda () (interactive) (load-file "~/.emacs")) :which-key "reload config")
  148. "l" 'reposition-window
  149. "W" '(count-words-region :which-key "word count")
  150. "w" 'toggle-truncate-lines)
  151. (spcleader
  152. "n" '(:ignore t :which-key "Narrow")
  153. "nr" 'narrow-to-region
  154. "np" 'narrow-to-page
  155. "nf" 'narrow-to-defun
  156. "nc" 'polymode-toggle-chunk-narrowing
  157. "nw" 'widen)
  158. (spcleader
  159. "m" '(:ignore t :which-key "Modes")
  160. "mo" 'org-mode
  161. "mm" '(lambda () (interactive) (mu4e~headers-jump-to-maildir "/Inbox"))
  162. "me" 'eshell
  163. "mc" 'calc
  164. "mC" 'calendar))
  165. ;;;;; Hydra
  166. (use-package hydra)
  167. ;;;;; Evil
  168. ;;;;;; Evil
  169. (use-package evil
  170. :demand
  171. :config
  172. (evil-mode t)
  173. (setq evil-want-integration nil
  174. evil-want-keybinding nil
  175. evil-want-Y-yank-to-eol t
  176. ;; Colored cursors based on evil-state
  177. evil-emacs-state-cursor '("red" box)
  178. evil-normal-state-cursor '("green" box)
  179. evil-visual-state-cursor '("orange" box)
  180. evil-insert-state-cursor '("red" bar)
  181. evil-replace-state-cursor '("red" bar)
  182. evil-operator-state-cursor '("red" hollow)
  183. ;; use NORMAL mode/state EVERYWHERE by default
  184. evil-default-state 'normal
  185. evil-motion-state-modes nil
  186. evil-normal-state-modes nil
  187. evil-insert-state-modes nil
  188. ;; Use emacs state in these selected modes
  189. evil-emacs-state-modes nil
  190. ;; and don't let modes override the INSERT state (!)
  191. evil-overriding-maps nil
  192. evil-intercept-maps nil)
  193. ;; Set alias w to save-buffer (to continue using :w to save)
  194. (defalias 'w 'save-buffer)
  195. (defhydra hydra-window (:color red :timeout .3)
  196. "Windows"
  197. ("t" evil-window-left)
  198. ("T" evil-window-move-far-left)
  199. ("s" evil-window-down)
  200. ("S" evil-window-move-very-bottom)
  201. ("d" evil-window-up)
  202. ("D" evil-window-move-very-top)
  203. ("r" evil-window-right)
  204. ("R" evil-window-move-far-right)
  205. ("+" (evil-window-increase-height 4))
  206. ("-" (evil-window-decrease-height 4))
  207. ("/" (evil-window-decrease-width 4))
  208. ("*" (evil-window-increase-width 4))
  209. ("h" evil-window-split)
  210. ("v" evil-window-vsplit)
  211. ("c" evil-window-delete)
  212. ("o" delete-other-windows)
  213. ("é" nil "Cancel"))
  214. :general
  215. (:states 'visual
  216. "l" 'evil-delete
  217. "H" 'evil-change
  218. "J" 'evil-join)
  219. (:states '(visual normal motion emacs)
  220. "é" 'hydra-window/body)
  221. (:states '(normal motion)
  222. "t" 'evil-backward-char
  223. "s" 'evil-next-visual-line
  224. "d" 'evil-previous-visual-line
  225. "r" 'evil-forward-char
  226. "T" 'evil-window-top
  227. "S" 'evil-scroll-down
  228. "D" 'evil-scroll-up
  229. "R" 'evil-window-bottom
  230. "l" 'evil-delete
  231. "L" 'evil-delete-line
  232. "h" 'evil-replace
  233. "H" 'evil-replace-state
  234. "gs" 'evil-next-line
  235. "gd" 'evil-previous-line
  236. "M" 'evil-window-middle
  237. "j" 'evil-find-char-to
  238. ";" 'evil-repeat-find-char-reverse
  239. "," 'evil-repeat-find-char
  240. "/" 'counsel-grep-or-swiper
  241. "÷" 'evil-ex
  242. "gt" 'previous-buffer
  243. "C-s" 'evil-scroll-line-down
  244. "C-d" 'evil-scroll-line-up
  245. "C-o" 'evil-jump-backward)
  246. (:states 'insert
  247. "C-r" 'counsel-yank-pop
  248. "C-u" 'counsel-unicode-char))
  249. ;;;;;; Evil-numbers
  250. (use-package evil-numbers
  251. :general
  252. (:states '(normal motion)
  253. "+" 'evil-numbers/inc-at-pt
  254. "-" 'evil-numbers/dec-at-pt))
  255. ;;;;;; Evil-escape
  256. (use-package evil-escape
  257. :config
  258. (evil-escape-mode t)
  259. (setq-default evil-escape-key-sequence "ii"
  260. evil-escape-delay 0.2))
  261. ;;;;;; Evil-commentary
  262. (use-package evil-commentary
  263. :demand
  264. :config
  265. (evil-commentary-mode t)
  266. :general
  267. (:states 'normal
  268. "gcc" 'evil-commentary-line))
  269. ;;;;;; Evil-surround
  270. (use-package evil-surround
  271. :config
  272. (global-evil-surround-mode))
  273. ;;;;;; Evil-lion
  274. (use-package evil-lion
  275. :general
  276. (spcleader
  277. "a" 'evil-lion-left
  278. "A" 'evil-lion-right))
  279. ;;;;; Which-key
  280. (use-package which-key
  281. :config
  282. (which-key-mode t)
  283. (setq which-key-allow-evil-operators t))
  284. ;;;; Basics
  285. ;;;;; Built-in
  286. ;;;;;; Package
  287. (use-package package
  288. :general
  289. (:keymaps 'package-menu-mode-map
  290. :states 'normal
  291. "q" 'quit-window))
  292. ;;;;;; Custom
  293. (use-package cus-edit
  294. :ensure nil
  295. :config
  296. (add-to-list 'evil-emacs-state-modes 'Custom-mode))
  297. ;;;;;; Ediff
  298. (use-package ediff
  299. :config
  300. (setq ediff-merge-split-window-function 'split-window-vertically
  301. ediff-window-setup-function 'ediff-setup-windows-plain)
  302. (add-to-list 'evil-emacs-state-modes 'ediff-mode))
  303. ;;;;;; Debugger
  304. (use-package debug
  305. :demand
  306. :config
  307. (add-to-list 'evil-emacs-state-modes 'debugger-mode))
  308. ;;;;;; Paren
  309. (use-package paren
  310. :config
  311. (show-paren-mode t)
  312. (setq show-paren-delay 0))
  313. ;;;;;; Flyspell
  314. (use-package flyspell
  315. :general
  316. (spcleader
  317. "s" '(:ignore t :which-key "Flyspell")
  318. "ss" 'flyspell-goto-next-error
  319. "sd" 'flyspell-check-previous-highlighted-word
  320. "sc" 'ispell-word
  321. "sf" '((lambda () (interactive) (ispell-change-dictionary "francais") (flyspell-buffer)) :which-key "Switch to French")
  322. "sa" '((lambda () (interactive) (ispell-change-dictionary "american") (flyspell-buffer)) :which-key "Switch to American"))
  323. (:states 'insert
  324. "C-s" 'flyspell-check-previous-highlighted-word)
  325. :hook (prog-mode . flyspell-prog-mode))
  326. ;;;;;; Tar-mode
  327. (use-package tar-mode
  328. :general
  329. (:keymaps 'tar-mode-map
  330. :states 'normal
  331. "RET" 'tar-extract-other-window))
  332. ;;;;;; Whitespace
  333. (use-package whitespace
  334. :config
  335. (setq whitespace-style
  336. '(face
  337. tabs
  338. spaces
  339. trailing
  340. empty
  341. space-mark
  342. tab-mark
  343. ))
  344. :hook (before-save . whitespace-cleanup))
  345. ;;;;;; Info
  346. (use-package info
  347. :general
  348. (:keymaps 'Info-mode-map
  349. :states 'normal
  350. "ð" 'Info-backward-node
  351. "ß" 'Info-forward-node
  352. "Þ" 'Info-up
  353. "þ" 'Info-up
  354. "q" 'Info-exit
  355. "ẞ" 'Info-next
  356. "Ð" 'Info-prev
  357. "gr" 'Info-history-forward
  358. "gt" 'Info-history-back
  359. "s" 'evil-scroll-line-down
  360. "d" 'evil-scroll-line-up))
  361. ;;;;;; Highlight line
  362. (use-package hl-line
  363. :config
  364. (global-hl-line-mode t)
  365. :custom-face
  366. (hl-line ((t (:background "gray10")))))
  367. ;;;;;; Simple
  368. (use-package simple
  369. :ensure nil
  370. :config
  371. (global-visual-line-mode t)
  372. :custom-face
  373. (italic ((t (:family "Fira Code Italic"
  374. :foundry "Fira Code Italic")))))
  375. ;;;;;; Revert
  376. (use-package autorevert
  377. :config
  378. (global-auto-revert-mode t))
  379. ;;;;;; Elisp
  380. (use-package elisp-mode
  381. :ensure nil
  382. :config
  383. ;; No size limit to output in elisp mode
  384. (setq eval-expression-print-length nil)
  385. :general
  386. (:keymaps 'emacs-lisp-mode-map
  387. :states 'normal
  388. "RET" 'eval-defun)
  389. (:keymaps 'emacs-lisp-mode-map
  390. :states 'visual
  391. "RET" '(lambda (start end)
  392. (interactive "r")
  393. (eval-region start end t))))
  394. ;;;;;; Help
  395. (use-package help-mode
  396. :ensure nil
  397. :config
  398. (add-to-list 'display-buffer-alist '("*Help*"
  399. (display-buffer-reuse-window display-buffer-in-side-window)
  400. (side . left)
  401. (window-width . 80)
  402. (reusable-frames . nil)))
  403. :general
  404. (spcleader
  405. "h" '(:ignore t :which-key "Help")
  406. "hh" 'help-for-help
  407. "ha" 'apropos-command
  408. "hb" 'counsel-descbinds
  409. "hv" 'counsel-describe-variable
  410. "hf" 'counsel-describe-function
  411. "ho" 'helpful-at-point
  412. "hm" 'describe-mode
  413. "hp" 'finder-by-keyword
  414. "hP" 'describe-package
  415. "hk" 'helpful-key
  416. "hK" 'Info-goto-emacs-key-command-node
  417. "hi" 'info
  418. "hF" 'counsel-faces
  419. "hc" 'counsel-colors-emacs
  420. "hL" 'describe-language-environment)
  421. (:keymaps 'help-mode-map
  422. :states 'normal
  423. "TAB" 'forward-button
  424. "q" 'quit-window
  425. "P" 'help-go-back
  426. "N" 'help-go-forward)
  427. :hook (help-mode . (lambda ()
  428. (setq buffer-face-mode-face '(:background "#102030"))
  429. (buffer-face-mode 1))))
  430. ;;;;;; Markdown
  431. (use-package markdown-mode
  432. :config
  433. (setq markdown-asymmetric-header t)
  434. :custom-face
  435. (markdown-header-face-1 ((t (:inherit 'outline-1))))
  436. (markdown-header-face-2 ((t (:inherit 'outline-2))))
  437. (markdown-header-face-3 ((t (:inherit 'outline-3))))
  438. (markdown-header-face-4 ((t (:inherit 'outline-4))))
  439. (markdown-header-face-5 ((t (:inherit 'outline-5))))
  440. (markdown-bold-face ((t (:foreground "#ede0ce"))))
  441. (markdown-italic-face ((t (:foreground "#ede0ce"))))
  442. (markdown-header-delimiter-face ((t (:foreground "gray30")))))
  443. ;;;;;; Eshell
  444. ;; eshell-mode-map is not ppoulated outside of eshell
  445. ;; So we need to define bindings in a hook
  446. (defun maxx/eshell-keys ()
  447. (evil-define-key*
  448. 'insert
  449. eshell-mode-map
  450. "ð" 'eshell-previous-matching-input-from-input
  451. "ß" 'eshell-next-matching-input-from-input
  452. "þ" 'eshell-backward-argument
  453. "®" 'eshell-forward-argument
  454. "Þ" 'eshell-kill-input
  455. "Ð" 'eshell-previous-prompt
  456. "ẞ" 'eshell-next-prompt
  457. "C-l" 'eshell/clear)
  458. )
  459. (use-package eshell
  460. :config
  461. (setq eshell-scroll-to-bottom-on-input t)
  462. (add-to-list 'evil-insert-state-modes 'eshell-mode)
  463. :hook (eshell-first-time-mode . maxx/eshell-keys))
  464. ;;;;;; Zoom
  465. (use-package face-remap
  466. :config
  467. (defhydra hydra-zoom (:color red)
  468. "Zoom"
  469. ("+" text-scale-increase)
  470. ("-" text-scale-decrease)
  471. ("/" (text-scale-adjust 0) "Reset"))
  472. :general
  473. (:states 'normal
  474. "C-+" 'hydra-zoom/text-scale-increase
  475. "C--" 'hydra-zoom/text-scale-decrease
  476. "C-/" '(lambda () (interactive) (text-scale-adjust 0))))
  477. ;;;;;; Calc
  478. (use-package calc
  479. :config
  480. (add-to-list 'evil-emacs-state-modes 'calc-mode))
  481. ;;;;;; Calendar
  482. (use-package calendar
  483. :config
  484. (calendar-set-date-style 'iso)
  485. (setq holiday-french-holidays
  486. `((holiday-fixed 1 1 "Jour de l'an")
  487. (holiday-fixed 1 6 "Épiphanie")
  488. (holiday-fixed 2 2 "Chandeleur")
  489. (holiday-fixed 2 14 "Saint Valentin")
  490. (holiday-fixed 5 1 "Fête du travail")
  491. (holiday-fixed 5 8 "Commémoration de la capitulation de l'Allemagne en 1945")
  492. (holiday-fixed 6 21 "Fête de la musique")
  493. (holiday-fixed 7 14 "Fête nationale - Prise de la Bastille")
  494. (holiday-fixed 8 15 "Assomption (Religieux)")
  495. (holiday-fixed 11 11 "Armistice de 1918")
  496. (holiday-fixed 11 1 "Toussaint")
  497. (holiday-fixed 11 2 "Commémoration des fidèles défunts")
  498. (holiday-fixed 12 25 "Noël")
  499. ;; fetes a date variable
  500. (holiday-easter-etc 0 "Pâques")
  501. (holiday-easter-etc 1 "Lundi de Pâques")
  502. (holiday-easter-etc 39 "Ascension")
  503. (holiday-easter-etc 49 "Pentecôte")
  504. (holiday-easter-etc -47 "Mardi gras")
  505. (holiday-float 5 0 4 "Fête des mères")
  506. (holiday-float 6 0 3 "Fête des pères")))
  507. (setq calendar-week-start-day 1
  508. calendar-holidays holiday-french-holidays
  509. calendar-mark-holidays-initially-flag nil
  510. calendar-mark-diary-entries-flag t
  511. calendar-view-diary-initially-flag t
  512. calendar-view-holidays-initially-flag t
  513. calendar-left-margin 4)
  514. (add-to-list 'display-buffer-alist '("^Calendar"
  515. (display-buffer-reuse-window display-buffer-in-side-window)
  516. (side . top)
  517. (window-height . 12)
  518. (reusable-frames . nil)))
  519. :general
  520. (:keymaps 'calendar-mode-map
  521. :states 'normal
  522. "q" 'calendar-exit
  523. "ð" 'calendar-backward-week
  524. "ß" 'calendar-forward-week
  525. "þ" 'calendar-backward-day
  526. "®" 'calendar-forward-day
  527. "Þ" '(lambda ()
  528. (interactive)
  529. (calendar-backward-month 1)
  530. (calendar-scroll-right))
  531. "™" '(lambda ()
  532. (interactive)
  533. (calendar-forward-month 1)
  534. (calendar-scroll-left))
  535. "Ð" 'calendar-backward-year
  536. "ẞ" 'calendar-forward-year
  537. "T" 'calendar-goto-today
  538. "D" 'calendar-goto-date))
  539. ;;;;;; Diary
  540. (use-package diary-lib
  541. :config
  542. (setq diary-number-of-entries 7)
  543. (add-to-list 'display-buffer-alist '("\\*Holidays\\*"
  544. (display-buffer-reuse-window display-buffer-in-side-window)
  545. (side . top)
  546. (slot . 1)
  547. (window-height . 12)
  548. (reusable-frames . nil)))
  549. (add-to-list 'display-buffer-alist '("\\*Fancy Diary Entries\\*"
  550. (display-buffer-reuse-window display-buffer-in-side-window)
  551. (side . top)
  552. (slot . -1)
  553. (window-height . 12)
  554. (reusable-frames . nil)))
  555. :hook (diary-list-entries . diary-sort-entries)
  556. :custom-face
  557. (diary ((t (:foreground "black" :background "limegreen")))))
  558. ;;;;;; Minibuffer
  559. (use-package minibuffer
  560. :ensure nil
  561. :general
  562. (:keymaps 'read-expression-map
  563. "ð" 'previous-line-or-history-element
  564. "ß" 'next-line-or-history-element))
  565. ;;;;; Undo-tree
  566. (use-package undo-tree
  567. :demand
  568. :config
  569. (global-undo-tree-mode)
  570. (setq undo-tree-auto-save-history t
  571. undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo"))
  572. undo-tree-enable-undo-in-region nil)
  573. (add-to-list 'display-buffer-alist '("*undo-tree"
  574. (display-buffer-reuse-window display-buffer-in-side-window)
  575. (side . left)
  576. (window-width . 0.15)
  577. (reusable-frames . nil)))
  578. :general
  579. (spcleader
  580. "u" 'undo-tree-visualize)
  581. (:keymaps 'undo-tree-visualizer-mode-map
  582. :states 'normal
  583. "q" 'undo-tree-visualizer-quit
  584. "SPC u" 'undo-tree-visualizer-quit
  585. "d" 'undo-tree-visualize-undo
  586. "s" 'undo-tree-visualize-redo
  587. "D" 'undo-tree-visualizer-toggle-diff))
  588. ;;;;; Avy
  589. (use-package avy
  590. :config
  591. (setq avy-keys '(?t ?s ?r ?n)
  592. avy-background t
  593. avy-highlight-first t)
  594. :general
  595. (spcleader
  596. "SPC" '(avy-goto-char-timer :which-key "Avy"))
  597. :custom-face
  598. (avy-goto-char-timer-face ((t (:background nil :foreground "red2" :weight bold))))
  599. (avy-lead-face ((t (:background nil :foreground "red1"))))
  600. (avy-lead-face-0 ((t (:background nil :foreground "red4"))))
  601. (avy-lead-face-1 ((t (:background nil :foreground "red4"))))
  602. (avy-lead-face-2 ((t (:background nil :foreground "red4")))))
  603. ;;;;; Ace-link
  604. (use-package ace-link
  605. :general
  606. (:keymaps '(Info-mode-map
  607. help-mode-map
  608. helpful-mode-map
  609. mu4e-view-mode-map
  610. org-mode-map)
  611. :states 'normal
  612. "f" 'ace-link))
  613. ;;;;; Doom
  614. ;;;;;; Doom theme
  615. (use-package doom-themes
  616. :config
  617. (load-theme 'doom-peacock t)
  618. (setq doom-themes-enable-bold t
  619. doom-themes-enable-italic t)
  620. (doom-themes-visual-bell-config))
  621. ;;;;;; Doom modeline
  622. (use-package doom-modeline
  623. :config
  624. (setq doom-modeline-enable-word-count t)
  625. ;; first time run M-x all-the-icons-install-fonts
  626. :hook (after-init . doom-modeline-mode))
  627. ;;;;; Expand region
  628. (use-package expand-region
  629. :config
  630. (defhydra hydra-expand-region (:color red)
  631. "Expand-region"
  632. ("e" er/expand-region)
  633. ("E" er/contract-region))
  634. :general
  635. (spcleader
  636. "e" 'hydra-expand-region/er/expand-region
  637. "E" 'hydra-expand-region/er/contract-region))
  638. ;;;;; Autopairs
  639. (use-package autopair
  640. :config
  641. (autopair-global-mode))
  642. ;;;;; Minions
  643. (use-package minions
  644. :config
  645. (minions-mode t)
  646. (setq minions-mode-line-lighter ""))
  647. ;;;;; Helpful
  648. (use-package helpful
  649. :demand
  650. :config
  651. ;; Use helpful as backend for counsel describe
  652. (setq counsel-describe-function-function 'helpful-callable
  653. counsel-describe-variable-function 'helpful-variable
  654. ;; use only one buffer for help
  655. helpful-max-buffers 1)
  656. (add-to-list 'display-buffer-alist '("^\\*helpful"
  657. (display-buffer-reuse-window display-buffer-in-side-window)
  658. (side . left)
  659. (window-width . 80)
  660. (reusable-frames . nil)))
  661. :general
  662. (:keymaps 'helpful-mode-map
  663. :states 'normal
  664. "TAB" 'forward-button
  665. "q" 'quit-window)
  666. :hook (helpful-mode . (lambda ()
  667. (setq buffer-face-mode-face '(:background "#102030"))
  668. (buffer-face-mode 1)))
  669. :custom-face
  670. (helpful-heading ((t (:height 1.9)))))
  671. ;;;; Completion
  672. ;;;;; Ivy
  673. ;;;;;; Ivy
  674. (use-package ivy
  675. :config
  676. ;; Start with empty regex for describe function and variable
  677. (setf (alist-get 'counsel-describe-function ivy-initial-inputs-alist) ""
  678. (alist-get 'counsel-describe-variable ivy-initial-inputs-alist) "")
  679. (setq ivy-wrap t
  680. ivy-height 15
  681. ivy-use-virtual-buffers t
  682. ivy-count-format "(%d/%d) "
  683. ivy-extra-directories nil
  684. ivy-re-builders-alist '((t . ivy--regex-ignore-order)))
  685. :general
  686. (:keymaps '(ivy-mode-map ivy-minibuffer-map)
  687. "ð" 'ivy-previous-line
  688. "ß" 'ivy-next-line
  689. "ẞ" '(lambda ()
  690. (interactive)
  691. (scroll-other-window 1))
  692. "Ð" '(lambda ()
  693. (interactive)
  694. (scroll-other-window -1))
  695. "®" 'ivy-done
  696. "þ" '(lambda ()
  697. (interactive)
  698. (kill-buffer (ivy-state-current ivy-last)))
  699. "_" 'maxx/counsel-describe))
  700. ;;;;;; Counsel
  701. (use-package counsel
  702. :general
  703. (spcleader
  704. "i" 'counsel-imenu
  705. "f" 'counsel-find-file
  706. "b" 'counsel-switch-buffer
  707. "x" 'counsel-M-x
  708. "/" 'counsel-grep-or-swiper)
  709. ("M-x" 'counsel-M-x)
  710. (:states '(normal motion)
  711. ":" 'counsel-M-x))
  712. (defun maxx/counsel-describe ()
  713. "Display help for object at point in counsel"
  714. (interactive)
  715. (let ((inhibit-message t)
  716. (object (intern (ivy-state-current ivy-last))))
  717. (describe-symbol object)))
  718. ;;;;; Company-tabnine
  719. (use-package company-tabnine
  720. ;; install binaries with company-tabnine-install-binaries
  721. :demand)
  722. ;;;;; Company
  723. (use-package company
  724. :demand
  725. :config
  726. (global-company-mode t)
  727. (setq company-idle-delay 0
  728. tab-always-indent 'complete
  729. company-minimum-prefix-length 2)
  730. (nconc company-backends '(company-tabnine))
  731. :general
  732. (:keymaps 'company-active-map
  733. "ß" 'company-select-next
  734. "ð" 'company-select-previous
  735. "Ð" 'company-previous-page
  736. "ẞ" 'company-next-page
  737. "þ" 'company-abort
  738. "®" 'company-complete
  739. "_" 'company-show-doc-buffer))
  740. ;;;; Projectile
  741. ;;;;; Projectile
  742. (use-package projectile
  743. :config
  744. (setq projectile-project-root-files '("README.org"))
  745. (setq projectile-completion-system 'ivy)
  746. (mapcar 'projectile-add-known-project
  747. (mapcar (lambda (path) (substring path 0 -10))
  748. (directory-files-recursively "~/Projects" "README.org"))))
  749. ;;;;; Counsel-projectile
  750. (use-package counsel-projectile
  751. :config
  752. (setq counsel-projectile-org-capture-templates
  753. '(("pt"
  754. "[${name}] Todo"
  755. entry (file+headline "${root}/README.org" "Tasks")
  756. "* TODO %^{todo}\n %? \n %a")
  757. ("pn"
  758. "[${name}] Note"
  759. entry (file+olp+datetree "${root}/README.org" "Notes")
  760. "* %^{title}\n %?")))
  761. :general
  762. (spcleader
  763. "p" '(:ignore t :which-key "Projectile")
  764. "pf" 'counsel-projectile-find-file
  765. "pb" 'counsel-projectile-switch-to-buffer
  766. "pp" 'counsel-projectile-switch-project
  767. "pg" 'counsel-projectile-grep
  768. "p SPC" 'counsel-projectile))
  769. ;;;; Jump to definition
  770. (use-package dumb-jump
  771. :config
  772. (setq dumb-jump-selector 'ivy)
  773. :general
  774. (spcleader
  775. "d" 'dumb-jump-go))
  776. ;;;; CSV mode
  777. (use-package csv-mode)
  778. ;;;; ESS
  779. ;;;;; ESS
  780. (use-package ess
  781. :config
  782. (setq ess-ask-for-ess-directory nil)
  783. (add-to-list 'evil-insert-state-modes 'comint-mode)
  784. (add-to-list 'display-buffer-alist '("*R Dired"
  785. (display-buffer-reuse-window display-buffer-in-side-window)
  786. (side . right)
  787. (slot . 1)
  788. (window-width . 0.2)
  789. (reusable-frames . nil)))
  790. (add-to-list 'display-buffer-alist '("\\*Help\\[R"
  791. (display-buffer-reuse-window display-buffer-in-side-window)
  792. (side . right)
  793. (window-width . 0.4)
  794. (reusable-frames . nil)))
  795. (add-to-list 'display-buffer-alist '("*R:"
  796. (display-buffer-reuse-window display-buffer-in-side-window)
  797. (window-height . 0.3)
  798. (reusable-frames . nil)))
  799. :general
  800. (:keymaps 'ess-r-mode-map
  801. :states 'normal
  802. "RET" 'ess-eval-line-and-step)
  803. (:keymaps 'ess-r-mode-map
  804. :states 'visual
  805. "RET" 'ess-eval-region)
  806. (:keymaps 'ess-r-mode-map
  807. :states 'insert
  808. "»" '(lambda () (interactive) (insert "%>%")))
  809. (:keymaps 'inferior-ess-r-mode-map
  810. :states 'insert
  811. "ð" 'comint-previous-matching-input-from-input
  812. "ß" 'comint-next-matching-input-from-input
  813. "»" '(lambda () (interactive) (insert "%>%")))
  814. (:keymaps 'inferior-ess-r-mode-map
  815. :states '(insert normal)
  816. "C-d" 'evil-scroll-line-up
  817. "C-s" 'evil-scroll-line-down)
  818. (:keymaps 'inferior-ess-r-mode-map
  819. :states 'normal
  820. "i" '(lambda ()
  821. (interactive)
  822. (if (= (line-number-at-pos) (count-lines (point-min) (point-max)))
  823. (evil-insert 1)
  824. (progn (goto-char (point-max))
  825. (evil-append 1))))
  826. )
  827. :hook (ess-mode . (lambda ()
  828. (setq-local prettify-symbols-alist '(("%>%" . "|>")))
  829. (setq-local prettify-symbols-unprettify-at-point 'right-edge)
  830. (prettify-symbols-mode))))
  831. ;;;;; Poly-R
  832. (use-package poly-R
  833. :general
  834. (:keymaps '(markdown-mode-map ess-mode-map)
  835. :states 'normal
  836. "<tab>" 'markdown-cycle
  837. "ð" 'markdown-previous-visible-heading
  838. "ß" 'markdown-next-visible-heading
  839. "Ð" 'markdown-outline-previous-same-level
  840. "ẞ" 'markdown-outline-next-same-level
  841. "þ" 'markdown-hide-subtree
  842. "®" '(lambda () (interactive)
  843. (markdown-show-children)
  844. (markdown-show-entry))
  845. "Þ" 'markdown-up-heading
  846. "M-r" 'markdown-demote
  847. "M-t" 'markdown-promote
  848. "M-d" 'markdown-move-up
  849. "M-s" 'markdown-move-down))
  850. ;;;; Git
  851. ;;;;; Magit
  852. (use-package magit
  853. :config
  854. (setq magit-status-goto-file-position t
  855. magit-popup-show-help-echo nil)
  856. (add-to-list 'evil-emacs-state-modes 'magit-mode)
  857. (add-to-list 'evil-emacs-state-modes 'git-rebase-mode)
  858. (add-to-list 'display-buffer-alist '("magit"
  859. (display-buffer-reuse-window display-buffer-in-side-window)
  860. (side . left)
  861. (window-width . 80)
  862. (reusable-frames . nil)))
  863. (add-to-list 'display-buffer-alist '("magit-diff"
  864. (display-buffer-reuse-window display-buffer-in-side-window)
  865. (side . left)
  866. (slot . 1)
  867. (window-height . .5)
  868. (window-width . 80)
  869. (reusable-frames . nil)))
  870. :general
  871. (spcleader
  872. "g" '(:ignore t :which-key "Magit")
  873. "gd" 'magit-file-dispatch
  874. "gs" 'magit-status)
  875. (:keymaps '(magit-hunk-section-map
  876. magit-file-section-map
  877. magit-staged-section-map
  878. magit-unstaged-section-map
  879. magit-revision-mode-map
  880. magit-section-map
  881. magit-refs-mode-map
  882. magit-log-mode-map
  883. magit-diff-mode-map
  884. magit-untracked-section-map
  885. magit-status-mode-map
  886. magit-stash-section-map)
  887. "ð" 'magit-section-backward
  888. "ß" 'magit-section-forward
  889. "þ" 'magit-section-hide
  890. "®" 'magit-section-show
  891. "s" 'magit-next-line
  892. "d" 'magit-previous-line
  893. "q" 'quit-window)
  894. (:keymaps '(magit-hunk-section-map
  895. magit-status-mode-map
  896. magit-unstaged-section-map
  897. magit-untracked-section-map)
  898. "+" 'magit-stage
  899. "-" 'magit-unstage))
  900. ;;;;; Magit-todos
  901. (use-package magit-todos
  902. :config
  903. (magit-todos-mode))
  904. ;;;;; Smerge
  905. (use-package smerge-mode
  906. :general
  907. (:keymaps 'smerge-mode-map
  908. :states 'normal
  909. "RET" 'smerge-keep-current))
  910. ;;;;; Git-gutter-fringe
  911. (use-package git-gutter-fringe
  912. :config
  913. (global-git-gutter-mode t))
  914. ;;;; Slime
  915. (use-package slime
  916. :config
  917. (setq inferior-lisp-program "clisp"))
  918. ;;;; Flycheck
  919. (use-package flycheck
  920. :config
  921. (global-flycheck-mode))
  922. ;;;; Org
  923. ;;;;; Org
  924. (use-package org
  925. :demand
  926. :config
  927. ;; Supported languages in babel
  928. (org-babel-do-load-languages
  929. 'org-babel-load-languages
  930. '((python . t)
  931. (R . t)
  932. (emacs-lisp . t)
  933. (shell . t)))
  934. (setq org-catch-invisible-edits 'smart
  935. ;; Folders
  936. org-directory "~/Projects"
  937. org-agenda-files (directory-files-recursively "~/Projects" "\.org$")
  938. org-default-notes-file "~/Projects/agenda.org"
  939. ;; Startup
  940. org-startup-folded t
  941. org-startup-with-inline-images t
  942. org-startup-indented t
  943. org-startup-truncated t
  944. org-hide-emphasis-markers t
  945. org-hide-block-startup t
  946. ;; Org sub/superscript behavior
  947. org-use-sub-superscripts '{}
  948. org-pretty-entities t
  949. org-pretty-entities-include-sub-superscripts t
  950. ;; RET behavior
  951. org-M-RET-may-split-line nil
  952. org-return-follows-link t
  953. org-image-actual-width 600
  954. ;; Generate UUIDs for links when storing link
  955. org-id-link-to-org-use-id t
  956. ;; Make todos dependent
  957. org-enforce-todo-checkbox-dependencies t
  958. org-enforce-todo-dependencies t
  959. ;; Hide blocked todos from agenda
  960. org-agenda-dim-blocked-tasks 'invisible
  961. ;; Log states
  962. org-log-into-drawer t
  963. ;; Recursive todo statistics
  964. org-hierarchical-todo-statistics nil
  965. ;; Agenda window
  966. org-agenda-window-setup 'current-window
  967. org-agenda-restore-windows-after-quit t
  968. ;; Colors for TODOS
  969. org-todo-keyword-faces
  970. '(("TODO" . "red")
  971. ("WAITING" . "orange")
  972. ("CANCELED" . (:strike-through t :foreground "DimGrey" :weight bold)))
  973. ;; Agenda for 10 days from 1 day before
  974. org-agenda-span 10
  975. org-agenda-start-day "-1d"
  976. org-agenda-include-diary t
  977. org-agenda-skip-scheduled-if-deadline-is-shown t
  978. org-agenda-tags-column -78
  979. org-agenda-start-with-follow-mode t
  980. ;; org-agenda-skip-deadline-prewarning-if-scheduled 'pre-scheduled
  981. ;; org-agenda-todo-ignore-scheduled 'all
  982. ;; org-agenda-sorting-strategy
  983. ;; '((agenda deadline-up priority-down)
  984. ;; (todo priority-down category-keep)
  985. ;; (tags priority-down category-keep)
  986. ;; (search category-keep))
  987. )
  988. ;; Capture templates
  989. (setq org-capture-templates
  990. '(("t"
  991. "todo"
  992. entry (file+headline org-default-notes-file "Tasks")
  993. "* SOMEDAY %^{todo}\n %? \n %a")
  994. ("n"
  995. "note"
  996. entry (file+headline org-default-notes-file "Notes")
  997. "* %^{title}\n %?")
  998. ("j"
  999. "journal note"
  1000. entry (file+olp+datetree org-default-notes-file "Journal")
  1001. "* %^{title}\n %?")
  1002. ("c"
  1003. "citation"
  1004. entry (file+headline org-default-notes-file "Citations")
  1005. "")
  1006. ("C"
  1007. "cheatsheet"
  1008. entry (file+headline org-default-notes-file "Cheatsheets")
  1009. "* %^{title}\n %?")))
  1010. ;; Org windows
  1011. (add-to-list 'display-buffer-alist '("*Org Agenda*"
  1012. (display-buffer-reuse-window display-buffer-in-side-window)
  1013. (side . right)
  1014. (window-width . 80)
  1015. (reusable-frames . nil)))
  1016. ;; Project mode
  1017. (add-to-list 'org-capture-templates
  1018. '("p"
  1019. "project"
  1020. entry (file+headline "~/Projects/projects.org" "Projects")
  1021. "* %^{Nom du projet}\n %?\n"))
  1022. ;; Register the dotfiles README.org
  1023. (add-to-list 'org-agenda-files "~/dotfiles/README.org")
  1024. ;; Allow emphasis markup in the middle of words
  1025. (setcar org-emphasis-regexp-components " \t('\"{[:alpha:]")
  1026. (setcar (nthcdr 1 org-emphasis-regexp-components) "[:alpha:]- \t.,:!?;'\")}\\")
  1027. (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
  1028. ;; Strike-through for checked boxes
  1029. (defface org-checkbox-done-text
  1030. '((t (:foreground "DimGrey" :strike-through t)))
  1031. "Face for text of checked boxes")
  1032. (font-lock-add-keywords
  1033. 'org-mode
  1034. `(("^[ \t]*\\(?:[-+*]\\|[0-9]+[).]\\)[ \t]+\\(\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\(?:X\\|\\([0-9]+\\)/\\2\\)\\][^\n]*\n\\)"
  1035. 1 'org-checkbox-done-text prepend))
  1036. 'append)
  1037. ;; Menu keybindings
  1038. :general
  1039. (spcleader
  1040. "o" '(:ignore t :which-key "Org")
  1041. "oo" '((lambda () (interactive) (find-file org-default-notes-file)) :which-key "Open org file")
  1042. "oa" 'org-agenda
  1043. "oc" 'counsel-projectile-org-capture
  1044. "ol" 'org-insert-link
  1045. "oL" 'org-store-link
  1046. "oi" 'org-redisplay-inline-images
  1047. "os" 'org-sort
  1048. "o*" 'org-toggle-heading
  1049. "o/" 'org-sparse-tree
  1050. "o|" 'org-table-create-or-convert-from-region
  1051. "oe" 'org-table-edit-field
  1052. "oE" 'org-export-dispatch
  1053. "o}" 'org-table-toggle-coordinate-overlays
  1054. "o{" 'org-table-toggle-formula-debugger
  1055. "o?" 'org-table-field-info
  1056. "o=" 'org-table-eval-formula
  1057. "od" 'org-insert-drawer
  1058. "ot" 'org-todo
  1059. "op" 'org-set-property
  1060. "oC" 'org-columns
  1061. "of" 'org-footnote-action
  1062. "ow" 'org-refile)
  1063. ;; Normal keybindings
  1064. (:keymaps 'org-mode-map
  1065. :states 'normal
  1066. "gt" 'org-mark-ring-goto
  1067. "U" 'undo-tree-redo
  1068. "<tab>" 'org-cycle
  1069. "S-<tab>" 'org-global-cycle
  1070. "M-s" 'org-metadown
  1071. "M-d" 'org-metaup
  1072. "M-r" 'org-metaright
  1073. "M-t" 'org-metaleft
  1074. "M-S" 'org-shiftmetadown
  1075. "M-D" 'org-shiftmetaup
  1076. "M-R" 'org-shiftmetaright
  1077. "M-T" 'org-shiftmetaleft
  1078. "C-s" 'org-shiftdown
  1079. "C-d" 'org-shiftup
  1080. "C-r" 'org-shiftright
  1081. "C-t" 'org-shiftleft)
  1082. ;; Insert keybindings
  1083. (:keymaps 'org-mode-map
  1084. :states '(normal insert)
  1085. "Þ" 'outline-up-heading
  1086. "Ð" 'outline-backward-same-level
  1087. "ẞ" 'outline-forward-same-level
  1088. "þ" 'outshine-kbd-M-<left>
  1089. "®" 'outshine-kbd-M-<right>
  1090. "ð" 'org-previous-visible-heading
  1091. "ß" 'org-next-visible-heading)
  1092. ;; Agenda keybindings
  1093. (:keymaps 'org-agenda-mode-map
  1094. :states '(normal)
  1095. "q" 'org-agenda-quit
  1096. "C-d" 'org-agenda-priority-up
  1097. "C-s" 'org-agenda-priority-down
  1098. "T" 'org-agenda-todo
  1099. "ß" 'org-agenda-next-item
  1100. "ð" 'org-agenda-previous-item
  1101. "RET" 'org-agenda-goto
  1102. "®" 'org-agenda-goto
  1103. "_" 'org-agenda-cycle-show
  1104. "C" 'org-agenda-columns)
  1105. ;; Pretty checkboxes
  1106. :hook (org-mode . (lambda ()
  1107. (push '("[ ]" . "☐") prettify-symbols-alist)
  1108. (push '("[X]" . "☑" ) prettify-symbols-alist)
  1109. (push '("[-]" . "☒" ) prettify-symbols-alist)
  1110. (setq-local prettify-symbols-unprettify-at-point 'right-edge)
  1111. (prettify-symbols-mode)))
  1112. :custom-face
  1113. (highlight ((t (:background nil :foreground nil :box (:line-width 2 :color "dim gray") :DistantForeground nil))))
  1114. (outline-1 ((t (:height 1.9 :background nil))))
  1115. (outline-2 ((t (:height 1.6))))
  1116. (outline-3 ((t (:height 1.4))))
  1117. (outline-4 ((t (:height 1.2))))
  1118. (outline-5 ((t (:height 1.1)))))
  1119. ;;;;; Org-bullets
  1120. (use-package org-bullets
  1121. :config
  1122. (setq org-hide-leading-stars t)
  1123. :hook (org-mode . org-bullets-mode))
  1124. ;;;;; Org fancy priorities
  1125. (use-package org-fancy-priorities
  1126. :config
  1127. ;; Set colors
  1128. (setq org-priority-faces
  1129. '((?A . "#ff5d38")
  1130. (?B . "orange")
  1131. (?C . "#98be65")))
  1132. ;; Set chars
  1133. (setq org-fancy-priorities-list
  1134. '((?A . "⬆")
  1135. (?B . "·")
  1136. (?C . "⬇")))
  1137. :hook (org-mode . org-fancy-priorities-mode))
  1138. ;;;;; Outshine
  1139. (use-package outshine
  1140. :general
  1141. (:keymaps 'outshine-mode-map
  1142. :states 'normal
  1143. "<tab>" 'outshine-cycle
  1144. "S-<tab>" 'outshine-cycle-buffer
  1145. "ð" 'outline-previous-visible-heading
  1146. "ß" 'outline-next-visible-heading
  1147. "Ð" 'outline-backward-same-level
  1148. "ẞ" 'outline-forward-same-level
  1149. "Þ" 'outline-up-heading
  1150. "þ" 'outshine-kbd-M-<left>
  1151. "®" 'outshine-kbd-M-<right>
  1152. "M-t" 'outshine-kbd-M-S-<left>
  1153. "M-r" 'outshine-kbd-M-S-<right>
  1154. "M-d" 'outshine-kbd-M-S-<up>
  1155. "M-s" 'outshine-kbd-M-S-<down>
  1156. )
  1157. :hook (emacs-lisp-mode . outshine-mode))
  1158. ;;;; Mu4e
  1159. ;;;;; Mu4e
  1160. (use-package mu4e
  1161. :demand
  1162. :load-path "/usr/share/emacs/site-lisp/mu4e/"
  1163. :config
  1164. (add-to-list 'evil-emacs-state-modes 'mu4e-main-mode)
  1165. ;; Folders
  1166. (setq mu4e-sent-folder "/Inbox"
  1167. mu4e-drafts-folder "/Drafts"
  1168. mu4e-trash-folder "/Trash")
  1169. ;; and their shortcuts
  1170. (setq mu4e-maildir-shortcuts
  1171. '(("/Inbox" . ?i)
  1172. ("/Archives" . ?a)
  1173. ("/Trash" . ?t)
  1174. ("/Junk" . ?j)
  1175. ("/Sent" . ?s)))
  1176. ;; Mail accounts
  1177. (cond ((equal (system-name) "hegp")
  1178. (setq mu4e-maildir (expand-file-name "~/Mail/aphp")
  1179. mu4e-get-mail-command "mbsync aphp"
  1180. mu4e-refile-folder "/Inbox/Archives"
  1181. mu4e-maildir-shortcuts
  1182. '(("/Inbox" . ?i)
  1183. ("/Inbox/Archives" . ?a)
  1184. ("/Trash" . ?t)
  1185. ("/Junk" . ?j)
  1186. ("/Sent" . ?s))
  1187. mu4e-compose-signature "Dr Maxime Wack, MD, MSc
  1188. Assistant Hospitalo-Universitaire
  1189. Pôle Informatique et Santé Publique
  1190. Hôpital Européen Georges Pompidou
  1191. tel: 01 56 09 23 63"))
  1192. ((equal (system-name) "laptop")
  1193. (setq mu4e-maildir (expand-file-name "~/Mail/free")
  1194. mu4e-get-mail-command "mbsync free"
  1195. mu4e-refile-folder "/Archives"
  1196. mu4e-compose-signature "Maxime"
  1197. )))
  1198. ;; Options
  1199. (setq mu4e-view-prefer-html t
  1200. mu4e-update-interval 180
  1201. mu4e-headers-auto-update t
  1202. mu4e-compose-signature-auto-include t
  1203. mu4e-compose-format-flowed t
  1204. mu4e-attachment-dir "~/Downloads"
  1205. mu4e-compose-in-new-frame t
  1206. mu4e-view-show-images t
  1207. mu4e-headers-sort-direction 'ascending
  1208. mu4e-confirm-quit nil
  1209. ;; Required by mbsync
  1210. mu4e-change-filenames-when-moving t
  1211. message-kill-buffer-on-exit t
  1212. mu4e-compose-dont-reply-to-self t
  1213. mu4e-completing-read-function 'ivy-completing-read
  1214. mu4e-split-view 'vertical
  1215. mu4e-headers-visible-columns 110
  1216. mu4e-headers-include-related nil
  1217. mu4e-headers-results-limit 500
  1218. )
  1219. (setq mu4e-headers-fields
  1220. '((:flags . 4)
  1221. (:thread-subject . 50)
  1222. (:size . 6)
  1223. (:from-or-to . 20)
  1224. (:human-date . 15)))
  1225. ;; Use imagemagick to view images, if available
  1226. (when (fboundp 'imagemagick-register-types)
  1227. (imagemagick-register-types))
  1228. (add-to-list 'mu4e-view-actions
  1229. '("browser" . mu4e-action-view-in-browser) t)
  1230. :general
  1231. (:keymaps 'mu4e-headers-mode-map
  1232. :states 'normal
  1233. "ð" 'mu4e-headers-prev
  1234. "ß" 'mu4e-headers-next
  1235. "RET" 'mu4e-headers-view-message
  1236. "®" 'mu4e-headers-view-message
  1237. "q" 'mu4e~headers-quit-buffer
  1238. "x" 'mu4e-headers-mark-for-trash
  1239. "a" 'mu4e-headers-mark-for-refile
  1240. "u" 'mu4e-headers-mark-for-unmark
  1241. "U" 'mu4e-mark-unmark-all
  1242. "X" 'mu4e-mark-execute-all
  1243. "W" 'mu4e-headers-toggle-include-related
  1244. "T" 'mu4e-compose-new
  1245. "F" 'mu4e-compose-forward
  1246. "R" 'mu4e-compose-reply
  1247. "m" 'mu4e-update-mail-and-index
  1248. "o" 'mu4e-headers-change-sorting
  1249. "'" 'mu4e~headers-jump-to-maildir
  1250. "M" 'mu4e-headers-mark-for-move
  1251. )
  1252. (:keymaps 'mu4e-view-mode-map
  1253. :states 'normal
  1254. "ð" 'mu4e-view-headers-prev
  1255. "ß" 'mu4e-view-headers-next
  1256. "þ" 'mu4e-select-other-view
  1257. "q" 'mu4e~view-quit-buffer
  1258. "x" 'mu4e-view-mark-for-trash
  1259. "a" 'mu4e-view-mark-for-refile
  1260. "u" 'mu4e-view-mark-for-unmark
  1261. "U" 'mu4e-mark-unmark-all
  1262. "X" 'mu4e-mark-execute-all
  1263. "T" 'mu4e-compose-new
  1264. "F" 'mu4e-compose-forward
  1265. "R" 'mu4e-compose-reply
  1266. "m" 'mu4e-update-mail-and-index
  1267. "'" 'mu4e~headers-jump-to-maildir
  1268. "h" 'mu4e-view-toggle-html
  1269. "M" 'mu4e-view-mark-for-move
  1270. "A" 'mu4e-view-attachment-action
  1271. )
  1272. )
  1273. ;;;;; smtpmail
  1274. (use-package smtpmail
  1275. :config
  1276. (setq smtpmail-queue-mail nil
  1277. message-send-mail-function 'smtpmail-send-it
  1278. send-mail-function 'smtpmail-send-it)
  1279. ;; Mail accounts
  1280. (cond ((equal (system-name) "laptop")
  1281. (setq smtpmail-smtp-server "smtp.free.fr"
  1282. auth-sources '(password-store)))
  1283. ((equal (system-name) "hegp")
  1284. (setq smtpmail-smtp-server "localhost"
  1285. auth-sources '(password-store)
  1286. smtpmail-smtp-service 1025))))
  1287. ;;;;; Org-mime
  1288. (use-package org-mime)
  1289. ;;;;; Org-mu4e
  1290. (use-package org-mu4e
  1291. :ensure nil
  1292. :config
  1293. (setq org-mu4e-convert-to-html t)
  1294. (defun org~mu4e-mime-convert-to-html ()
  1295. "Convert the current body to html."
  1296. (unless (fboundp 'org-export-string-as)
  1297. (mu4e-error "require function 'org-export-string-as not found"))
  1298. (let* ((begin
  1299. (save-excursion
  1300. (goto-char (point-min))
  1301. (search-forward mail-header-separator)))
  1302. (end (point-max))
  1303. (raw-body (buffer-substring begin end))
  1304. (tmp-file (make-temp-name (expand-file-name "mail"
  1305. temporary-file-directory)))
  1306. ;; because we probably don't want to skip part of our mail
  1307. (org-export-skip-text-before-1st-heading nil)
  1308. ;; because we probably don't want to export a huge style file
  1309. (org-export-htmlize-output-type 'inline-css)
  1310. ;; makes the replies with ">"s look nicer
  1311. (org-export-preserve-breaks nil)
  1312. ;; turn off TOC
  1313. (org-export-with-toc nil)
  1314. ;; dvipng for inline latex because MathJax doesn't work in mail
  1315. (org-export-with-LaTeX-fragments
  1316. (if (executable-find "dvipng") 'dvipng
  1317. (mu4e-message "Cannot find dvipng, ignore inline LaTeX") nil))
  1318. ;; to hold attachments for inline html images
  1319. (html-and-images
  1320. (org~mu4e-mime-replace-images
  1321. (org-export-string-as raw-body 'html t)
  1322. tmp-file))
  1323. (html-images (cdr html-and-images))
  1324. (html (car html-and-images)))
  1325. (delete-region begin end)
  1326. (save-excursion
  1327. (goto-char begin)
  1328. (newline)
  1329. (insert (org~mu4e-mime-multipart
  1330. raw-body html (mapconcat 'identity html-images "\n"))))))
  1331. :hook (mu4e-compose-mode . org-mu4e-compose-org-mode)
  1332. )
  1333. ;;;;; Htmlize
  1334. (use-package htmlize)