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.

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