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.

1997 lines
56KB

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