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.

1858 lines
51KB

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