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.

2859 lines
100KB

  1. ;;; package --- Summary
  2. ;;; Commentary:
  3. ;;; Code:
  4. ;;; Package management
  5. ;;;; Package
  6. (require 'package) ; Use 'package
  7. (setq package-archives '(("melpa" . "https://melpa.org/packages/")
  8. ("non-gnu" . "https://elpa.nongnu.org/nongnu/")
  9. ("gnu" . "https://elpa.gnu.org/packages/")))
  10. (setq package-enable-at-startup nil) ; Enable package at startup
  11. (package-initialize) ; And initialize
  12. ;;;; Use-package
  13. (prefer-coding-system 'utf-8)
  14. (setq-default ; Set options for use-package :
  15. use-package-always-ensure t ; - always ensure (use :ensure nil for built-in packages)
  16. use-package-expand-minimally t
  17. use-package-verbose nil
  18. use-package-enable-imenu-support t) ; Enable navigating between packages with imenu
  19. (unless (package-installed-p 'use-package) ; Bootstrap use-package
  20. (package-refresh-contents)
  21. (package-install 'use-package))
  22. (eval-when-compile (require 'use-package))
  23. ;;;; Quelpa
  24. (use-package quelpa)
  25. ;;; Custom and options
  26. ;;;; Custom file
  27. (setq custom-file "~/.config/emacs/custom.el")
  28. (load custom-file)
  29. ;;;; Options
  30. ;;;;; Truncate lines
  31. (setq-default truncate-lines t) ; Truncate lines by default in all buffers
  32. ;;;;; Mode-line
  33. (setq
  34. eol-mnemonic-unix "(Unix)" ; Mnemonics for eol
  35. size-indication-mode t ; Display total size of buffer and column index
  36. column-number-mode t ; Column numbers
  37. column-number-indicator-zero-based nil) ; Column numbers from 1
  38. ;;;;; Backup
  39. (setq
  40. delete-old-versions t ; delete excess backup versions silently
  41. make-backup-files nil ; make backup files
  42. version-control nil ; Use version control on backups
  43. vc-make-backup-files nil ; don't make backups file when in version controlled dir
  44. backup-directory-alist nil)
  45. ;;;;; Autosave
  46. (setq
  47. auto-save-default nil ; Enable
  48. auto-save-interval 300 ; Set interval and timeout
  49. auto-save-timeout 30
  50. auto-save-file-name-transforms nil) ; Set directory for auto-saves
  51. ;;;;; Scrolling
  52. (setq
  53. scroll-margin 10 ; Pad scrolling with 10 lines vertically
  54. hscroll-margin 10 ; and horizontally
  55. scroll-conservatively 100000 ; Sane defaults for a smooth scrolling experience
  56. scroll-preserve-screen-position 1
  57. hscroll-step 1
  58. maximum-scroll-margin 0.5)
  59. ;;;;; Disable GUI
  60. (menu-bar-mode -1) ; Disable all gui elements
  61. (tool-bar-mode -1)
  62. (scroll-bar-mode -1)
  63. (blink-cursor-mode -1)
  64. (tooltip-mode -1)
  65. (setq ; Disable startup stuff
  66. inhibit-startup-screen t
  67. inhibit-startup-message t
  68. inhibit-startup-echo-area-message t)
  69. ;;;;; UTF8
  70. (setq ; Use UTF8 for everything
  71. coding-system-for-read 'utf-8
  72. coding-system-for-write 'utf-8)
  73. (prefer-coding-system 'utf-8)
  74. (set-default-coding-systems 'utf-8)
  75. (set-terminal-coding-system 'utf-8)
  76. (set-keyboard-coding-system 'utf-8)
  77. ;;;;; Open new windows vertically
  78. (setq split-height-threshold 20
  79. split-width-threshold 80) ; with a minimal horizontal size of 80 chars
  80. ;; And define an alternate version of split-window-sensibly that tries first to split horizontally then vertically
  81. (defun maxx/split-window-sensibly (&optional window)
  82. "Apply the same rules as split-window-sensibly to WINDOW, but try first to split horizontally then vertically.
  83. Use split-{height,width}-threshold to decide which size to give a new window."
  84. (let ((window (or window (selected-window))))
  85. (or (and (window-splittable-p window t)
  86. ;; Split window horizontally.
  87. (with-selected-window window
  88. (split-window-right split-width-threshold)))
  89. (and (window-splittable-p window)
  90. ;; Split window vertically.
  91. (with-selected-window window
  92. (split-window-below split-height-threshold)))
  93. (and
  94. ;; If WINDOW is the only usable window on its frame (it is
  95. ;; the only one or, not being the only one, all the other
  96. ;; ones are dedicated) and is not the minibuffer window, try
  97. ;; to split it horizontally disregarding the value of
  98. ;; `split-height-threshold'.
  99. (let ((frame (window-frame window)))
  100. (or
  101. (eq window (frame-root-window frame))
  102. (catch 'done
  103. (walk-window-tree (lambda (w)
  104. (unless (or (eq w window)
  105. (window-dedicated-p w))
  106. (throw 'done nil)))
  107. frame)
  108. t)))
  109. (not (window-minibuffer-p window))
  110. (let ((split-height-threshold 0))
  111. (when (window-splittable-p window)
  112. (with-selected-window window
  113. (split-window-right))))))))
  114. (setq split-window-preferred-function 'maxx/split-window-sensibly)
  115. ;;;;; Set proxy at work
  116. (when (equal (system-name) "hegp") ; Set proxy settings when at work
  117. (setq url-proxy-services '(("no_proxy" . "127.0.0.1")
  118. ("http" . "proxym-inter.aphp.fr:8080")
  119. ("https" . "proxym-inter.aphp.fr:8080"))))
  120. ;;;;; Misc
  121. (require 'iso-transl) ; Fix dead_circumflex with ibus
  122. (put 'narrow-to-region 'disabled nil) ; Stop warning when using narrow and dired
  123. (put 'dired-find-alternate-file 'disabled nil)
  124. (setq
  125. initial-scratch-message ""
  126. debugger-bury-or-kill 'kill ; Kill debug windows after use
  127. mouse-wheel-scroll-amount '(1 ((shift) . 1) ((control) . 1)) ; Scroll smoothly with mouse
  128. standard-indent 2 ; Indent two spaces
  129. vc-handled-backends () ; disable VC
  130. vc-follow-symlinks t ; don't ask for confirmation when opening symlinked file
  131. vc-ignore-dir-regexp (format "\\(%s\\)\\|\\(%s\\)" ; disable vc for tramp files
  132. vc-ignore-dir-regexp
  133. tramp-file-name-regexp)
  134. ring-bell-function 'ignore ; silent bell when you make a mistake
  135. user-full-name "Maxime Wack" ; Identity
  136. gc-cons-threshold 50000000 ; GC and file size limits
  137. large-file-warning-threshold 100000000
  138. frame-title-format ; Filename in title
  139. '((:eval (concat (if (buffer-file-name)
  140. (abbreviate-file-name (buffer-file-name))
  141. "%b") " (" server-name ")"))))
  142. (setq-default
  143. indicate-empty-lines t ; Show empty lines at the end of the buffer
  144. tab-width 2 ; Spaces for indent
  145. indent-tabs-mode nil) ; Don't use tabs in indentation
  146. (set-frame-parameter (selected-frame) 'alpha '(85 . 95)) ; Set alpha
  147. (unless (equal (system-name) "hegp") ; Set font
  148. (set-frame-font "Fira Code 10" nil t))
  149. (add-to-list 'default-frame-alist '(font . "Fira Code 10"))
  150. ; Set font and alpha for GUI
  151. (add-to-list 'default-frame-alist '(alpha . (85 . 95)))
  152. (fset 'yes-or-no-p 'y-or-n-p) ; Replace yes/no questions with y/n
  153. (defun package--save-selected-packages (&rest opt) ; Disable tracking of installed packages
  154. "Disable package-selected-packages.
  155. OPT is the optional arg to the original function"
  156. nil)
  157. ;;; Packages
  158. ;;;; Keys
  159. ;;;;; General
  160. (defun maxx/kill-unmodified-buffers ()
  161. "Kill all the unmodified buffers."
  162. (interactive)
  163. (seq-do 'kill-buffer
  164. (seq-filter (lambda (x) (not (buffer-modified-p x))) (buffer-list))))
  165. (use-package general
  166. :demand
  167. :config
  168. (general-create-definer spcleader
  169. :states '(normal visual insert emacs)
  170. :prefix "SPC"
  171. :non-normal-prefix "M-SPC")
  172. (spcleader ; Misc spcleader bindings
  173. "RET" 'eval-defun
  174. "|" 'shell-command-on-region
  175. "." 'eval-expression
  176. "$" '((lambda () (interactive) (find-file "~/Projects/dotfiles/.config/emacs/init.el")) :which-key "open config")
  177. "#" '((lambda () (interactive) (load-file "~/Projects/dotfiles/.config/emacs/init.el")) :which-key "reload config")
  178. "l" 'reposition-window
  179. "W" '(count-words-region :which-key "word count")
  180. "w" 'visual-line-mode)
  181. (spcleader ; Killing buffers
  182. "k" '((lambda () (interactive) (persp-kill-buffer (current-buffer))) :which-key "kill buffer")
  183. "K" '(:ignore t :which-key "Kill buffers")
  184. "Kk" 'kill-some-buffers
  185. "Km" '(maxx/kill-unmodified-buffers :which-key "Kill unmodified buffers")
  186. "Kp" 'persp-kill)
  187. (spcleader ; Narrow
  188. "n" '(:ignore t :which-key "Narrow")
  189. "nr" 'narrow-to-region
  190. "np" 'narrow-to-page
  191. "nf" 'narrow-to-defun
  192. "nc" 'polymode-toggle-chunk-narrowing
  193. "nw" 'widen)
  194. (spcleader ; Direct access to modes
  195. "m" '(:ignore t :which-key "Modes")
  196. "mo" 'org-mode
  197. "mm" 'mu4e
  198. "me" 'eshell
  199. "mC" 'calc
  200. "mc" 'cfw:open-org-calendar
  201. "mr" 'ess-r-mode
  202. "mw" 'woman
  203. "mtv" 'seriestracker
  204. "map" 'osm-home
  205. "mf" 'elfeed))
  206. ;;;;; Hydra
  207. (use-package hydra)
  208. ;;;;; Evil
  209. ;;;;;; Evil
  210. (use-package evil
  211. :demand
  212. :after hydra
  213. :init
  214. (evil-mode t)
  215. :config
  216. (define-key global-map (kbd "<S-delete>") nil)
  217. (setq evil-want-integration nil
  218. evil-want-keybinding nil
  219. evil-want-Y-yank-to-eol t
  220. evil-emacs-state-cursor '("red" box) ; Colored cursors based on evil-state
  221. evil-normal-state-cursor '("green" box)
  222. evil-visual-state-cursor '("orange" box)
  223. evil-insert-state-cursor '("red" bar)
  224. evil-replace-state-cursor '("red" bar)
  225. evil-operator-state-cursor '("red" hollow)
  226. evil-default-state 'normal ; use NORMAL mode/state EVERYWHERE by default
  227. evil-motion-state-modes nil
  228. evil-normal-state-modes nil
  229. evil-insert-state-modes nil
  230. evil-emacs-state-modes nil
  231. evil-overriding-maps nil ; and don't let modes override the INSERT state (!)
  232. evil-intercept-maps nil
  233. evil-move-beyond-eol nil ; don't move beyond eol
  234. evil-auto-balance-windows nil ; do not auto balance windows
  235. evil-vsplit-window-right nil ; split vertically to the left (as the column argument
  236. ; in evil-window-vsplit is for the size of the *new* window
  237. )
  238. (defalias 'w 'save-buffer) ; Set alias w/W to save-buffer (to continue using :w to save)
  239. (defalias 'W 'save-buffer)
  240. (defhydra hydra-window (:color red :timeout .3) ; Define a hydra for working with windows
  241. "Windows"
  242. ("t" evil-window-left)
  243. ("T" evil-window-move-far-left)
  244. ("s" evil-window-down)
  245. ("S" evil-window-move-very-bottom)
  246. ("d" evil-window-up)
  247. ("D" evil-window-move-very-top)
  248. ("r" evil-window-right)
  249. ("R" evil-window-move-far-right)
  250. ("+" (evil-window-increase-height 4))
  251. ("-" (evil-window-decrease-height 4))
  252. ("/" (evil-window-decrease-width 4))
  253. ("*" (evil-window-increase-width 4))
  254. ("=" (balance-windows))
  255. ("h" evil-window-split)
  256. ("v" (lambda () (interactive)
  257. (evil-window-vsplit 80)))
  258. ("c" evil-window-delete)
  259. ("o" delete-other-windows)
  260. ("é" nil "Cancel"))
  261. :general
  262. (:states 'visual
  263. "l" 'evil-delete
  264. "H" 'evil-change
  265. "J" 'evil-join
  266. "u" 'undo)
  267. (:states '(visual normal motion emacs)
  268. "é" 'hydra-window/body)
  269. (:states '(normal motion) ; Bépo rebindings
  270. "t" 'evil-backward-char
  271. "s" 'evil-next-visual-line
  272. "d" 'evil-previous-visual-line
  273. "r" 'evil-forward-char
  274. "gs" 'evil-next-line
  275. "gd" 'evil-previous-line
  276. "C-s" 'evil-scroll-line-down
  277. "C-d" 'evil-scroll-line-up
  278. "T" 'evil-window-top
  279. "S" 'evil-scroll-down
  280. "D" 'evil-scroll-up
  281. "l" 'evil-delete
  282. "L" 'evil-delete-line
  283. "n" 'evil-search-previous
  284. "N" 'evil-search-next
  285. "h" 'evil-replace
  286. "H" 'evil-replace-state
  287. "R" 'evil-window-bottom
  288. "M" 'evil-window-middle
  289. "j" 'evil-find-char-to
  290. ";" 'evil-repeat-find-char-reverse ; Swap , and ;
  291. "," 'evil-repeat-find-char
  292. "q" '(lambda () (interactive) ; Quit normal windows with q
  293. (condition-case nil
  294. (delete-window)
  295. (error (quit-window))))
  296. "Q" 'evil-record-macro
  297. "u" 'undo-tree-undo ; Undo/redo with u/U and undo-tree
  298. "U" 'undo-tree-redo
  299. "/" 'counsel-grep-or-swiper
  300. "÷" 'evil-ex ; Access ex commands with ÷
  301. "zt" 'evil-close-fold ; Folding
  302. "zT" 'evil-close-folds
  303. "zr" 'evil-open-fold
  304. "zR" 'evil-open-folds
  305. "za" '((lambda () (interactive)
  306. (hs-life-goes-on
  307. (if (hs-already-hidden-p)
  308. (progn
  309. (hs-show-block)
  310. (hs-hide-level 1))
  311. (hs-hide-block))))
  312. :which-key "toggle fold one level")
  313. "zA" 'evil-toggle-fold
  314. "gt" 'previous-buffer ; Buffers like tabs
  315. "gr" 'next-buffer
  316. "gf" 'evil-find-file-at-point-with-line
  317. "C-o" 'evil-jump-backward
  318. "C-ð" '(lambda () (interactive) (scroll-other-window -1)) ; Scroll other window with C-Ralt
  319. "C-ß" '(lambda () (interactive) (scroll-other-window 1))
  320. "$" 'evil-end-of-visual-line
  321. "g$" 'evil-end-of-line
  322. "^" 'evil-first-non-blank-of-visual-line
  323. "g^" 'evil-first-non-blank)
  324. (:states 'insert
  325. "C-r" 'counsel-yank-pop
  326. "C-u" 'counsel-unicode-char
  327. "_" 'self-insert-command
  328. "<S-delete>" nil))
  329. ;;;;;; Evil-numbers
  330. (use-package evil-numbers
  331. :general
  332. (:states '(normal motion)
  333. "+" 'evil-numbers/inc-at-pt
  334. "-" 'evil-numbers/dec-at-pt))
  335. ;;;;;; Evil-escape
  336. (use-package evil-escape
  337. :init
  338. (evil-escape-mode t)
  339. :config
  340. (setq-default evil-escape-key-sequence "ii"
  341. evil-escape-delay 0.2))
  342. ;;;;;; Evil-commentary
  343. (use-package evil-commentary
  344. :demand
  345. :init
  346. (evil-commentary-mode t)
  347. :config ; Enable end-of-line comments
  348. (setq comment-inline-offset 5
  349. comment-auto-fill-only-comments t)
  350. (setq-default comment-column 80
  351. comment-fill-column nil
  352. fill-column 120)
  353. (defhydra hydra-comment (:color red :exit t) ; Hydra to access comment commands
  354. "Comments"
  355. ("c" comment-indent)
  356. ("k" comment-kill))
  357. :general
  358. (:states 'normal
  359. "gcc" 'evil-commentary-line)
  360. (:states 'insert
  361. "M-RET" 'indent-new-comment-line ; Continue comment on next line and add a line
  362. "M-j" '(lambda () (interactive) ; Continue comment on next line without adding a new line
  363. (evil-next-line)
  364. (comment-indent)))
  365. (spcleader
  366. "c" 'hydra-comment/body)
  367. :hook (prog-mode . (lambda () (setq-local comment-column 80) ; Set column and function in all prog modes to 80
  368. (setq-local comment-indent-function 'comment-indent-default)
  369. (turn-on-auto-fill))))
  370. ;;;;;; Evil-surround
  371. (use-package evil-surround
  372. :init
  373. (global-evil-surround-mode)
  374. :config
  375. (setq-default evil-surround-pairs-alist ; Redefined to stop inserting extraneous spaces
  376. '((40 "(" . ")")
  377. (91 "[" . "]")
  378. (?{ "{" . "}")
  379. (?< "<" . ">")
  380. (?- "-" . "-")
  381. (?_ "_" . "_")
  382. (?t . evil-surround-read-tag)
  383. (?f . evil-surround-function))))
  384. ;;;;;; Evil-lion
  385. (use-package evil-lion
  386. :general
  387. (spcleader
  388. "a" 'evil-lion-left
  389. "A" 'evil-lion-right))
  390. ;;;;;; Evil-args
  391. (use-package evil-args
  392. :general
  393. (:keymaps 'prog-mode-map
  394. :states 'normal
  395. "þ" 'evil-backward-arg
  396. "®" 'evil-forward-arg))
  397. ;;;;;; Text objects
  398. (defmacro define-and-bind-text-object (key start-regex end-regex) ; Macro to help define new text objects
  399. "Macro to help define and bind text objects.
  400. Bind KEY to a text-object defined by the region surrounded by START-REGEX and END-REGEX."
  401. (let ((inner-name (make-symbol "inner-name"))
  402. (outer-name (make-symbol "outer-name")))
  403. `(progn
  404. (evil-define-text-object ,inner-name (count &optional beg end type)
  405. (evil-select-paren ,start-regex ,end-regex beg end type count nil))
  406. (evil-define-text-object ,outer-name (count &optional beg end type)
  407. (evil-select-paren ,start-regex ,end-regex beg end type count t))
  408. (define-key evil-inner-text-objects-map ,key (quote ,inner-name))
  409. (define-key evil-outer-text-objects-map ,key (quote ,outer-name)))))
  410. (define-and-bind-text-object "_" "_" "_") ; Text objects for common separators
  411. (define-and-bind-text-object "-" "-" "-")
  412. (define-and-bind-text-object "," "," ",")
  413. (define-and-bind-text-object ";" ";" ";")
  414. (define-and-bind-text-object "/" "/" "/")
  415. (define-and-bind-text-object "|" "|" "|")
  416. (define-key evil-inner-text-objects-map "a" 'evil-inner-arg)
  417. (define-key evil-outer-text-objects-map "a" 'evil-outer-arg)
  418. ;;;;; Which-key
  419. (use-package which-key
  420. :init
  421. (which-key-mode t)
  422. :config
  423. (setq which-key-allow-evil-operators t))
  424. ;;;; Basics
  425. ;;;;; Built-in
  426. ;;;;;; Package
  427. (use-package package ; Manage packages
  428. :general
  429. (:keymaps 'package-menu-mode-map
  430. :states 'normal
  431. "q" 'kill-buffer-and-window
  432. "x" 'package-menu-execute))
  433. ;;;;;; Custom
  434. (use-package cus-edit ; Custom options
  435. :ensure nil
  436. :config
  437. (add-to-list 'evil-emacs-state-modes 'Custom-mode)) ; Custom mode in emacs state
  438. ;;;;;; Ediff
  439. (use-package ediff ; Diffs vertically
  440. :config
  441. (setq ediff-merge-split-window-function 'split-window-vertically
  442. ediff-window-setup-function 'ediff-setup-windows-plain)
  443. (add-to-list 'evil-emacs-state-modes 'ediff-mode))
  444. ;;;;;; Debugger
  445. (use-package debug
  446. :demand
  447. :config
  448. (add-to-list 'display-buffer-alist '("^\\*Backtrace"
  449. (display-buffer-reuse-window display-buffer-in-side-window)
  450. (side . top)
  451. (window-height . 20)
  452. (reusable-frames . nil)))
  453. :general
  454. (:keymaps 'debugger-mode-map
  455. :states 'normal
  456. "ð" 'backtrace-backward-frame
  457. "ß" 'backtrace-forward-frame
  458. "þ" 'backtrace-single-line
  459. "®" 'backtrace-multi-line
  460. "SPC" 'debugger-step-through
  461. "c" 'debugger-continue
  462. "b" 'debugger-frame
  463. "u" 'debugger-frame-clear
  464. "q" 'debugger-quit
  465. "v" 'backtrace-toggle-locals
  466. "e" 'debugger-eval-expression)
  467. :hook (debugger-mode . (lambda ()
  468. (setq buffer-face-mode-face '(:background "#301010"))
  469. (buffer-face-mode 1))))
  470. ;;;;;; Edebug
  471. (use-package edebug
  472. :general
  473. (:keymaps 'edebug-mode-map
  474. :states 'normal
  475. "SPC" 'edebug-step-mode
  476. "C" 'edebug-Continue-fast-mode
  477. "D" 'edebug-toggle-disable-breakpoint
  478. "G" 'edebug-Go-nonstop-mode
  479. "Q" 'edebug-top-level-nonstop
  480. "T" 'edebug-Trace-fast-mode
  481. "U" 'edebug-unset-breakpoints
  482. "W" 'edebug-toggle-save-windows
  483. "X" 'edebug-set-global-break-condition
  484. "a" 'recursive-edit
  485. "b" 'edebug-set-breakpoint
  486. "c" 'edebug-continue-mode
  487. "g" 'edebug-go-mode
  488. "q" 'top-level
  489. "t" 'edebug-trace-mode
  490. "u" 'edebug-unset-breakpoint
  491. "w" 'edebug-where
  492. "x" 'edebug-set-conditional-breakpoint)
  493. :hook (edebug-mode . (lambda ()
  494. (setq buffer-face-mode-face '(:background "#301010"))
  495. (if edebug-mode
  496. (buffer-face-mode 1)
  497. (buffer-face-mode -1)))))
  498. ;;;;;; Profiler
  499. (use-package profiler
  500. :general
  501. (:keymaps 'profiler-report-mode-map
  502. :states 'normal
  503. "ß" 'profiler-report-next-entry
  504. "ð" 'profiler-report-previous-entry
  505. "®" 'profiler-report-toggle-entry
  506. "þ" 'profiler-report-toggle-entry))
  507. ;;;;;; Paren
  508. (use-package paren ; Show parentheses
  509. :init
  510. (show-paren-mode t)
  511. :config
  512. (setq show-paren-delay 0)) ; Show parentheses immediately
  513. ;;;;;; Flyspell
  514. (use-package flyspell ; Spellcheck
  515. :general
  516. (spcleader
  517. "s" '(:ignore t :which-key "Flyspell")
  518. "ss" 'flyspell-goto-next-error
  519. "sd" 'flyspell-check-previous-highlighted-word
  520. "sc" 'ispell-word
  521. "sf" '((lambda () (interactive) (ispell-change-dictionary "francais") (flyspell-buffer)) :which-key "Switch to French")
  522. "sa" '((lambda () (interactive) (ispell-change-dictionary "american") (flyspell-buffer)) :which-key "Switch to American"))
  523. (:states 'insert
  524. "C-s" 'flyspell-check-previous-highlighted-word)
  525. :hook (prog-mode . flyspell-prog-mode)) ; Spellcheck comments in programming modes
  526. ;;;;;; Tar-mode
  527. (use-package tar-mode ; Open archives transparently
  528. :general
  529. (:keymaps 'tar-mode-map
  530. :states 'normal
  531. "RET" 'tar-extract-other-window))
  532. ;;;;;; Whitespace
  533. (use-package whitespace ; Show whitespaces and clean them upon saving
  534. :config
  535. (setq whitespace-style
  536. '(face
  537. tabs
  538. spaces
  539. trailing
  540. empty
  541. space-mark
  542. tab-mark
  543. )))
  544. ;;;;;; Info
  545. (use-package info ; Info mode
  546. :general
  547. (:keymaps 'Info-mode-map
  548. :states 'normal
  549. "ð" 'Info-backward-node
  550. "ß" 'Info-forward-node
  551. "Þ" 'Info-up
  552. "þ" 'Info-up
  553. "q" 'Info-exit
  554. "ẞ" 'Info-next
  555. "Ð" 'Info-prev
  556. "gr" 'Info-history-forward
  557. "gt" 'Info-history-back
  558. "gg" 'evil-goto-first-line
  559. "s" 'evil-next-visual-line
  560. "d" 'evil-previous-visual-line
  561. "RET" 'Info-follow-nearest-node))
  562. ;;;;;; Highlight line
  563. (use-package hl-line ; Highlight current line
  564. :init
  565. (global-hl-line-mode t)
  566. :custom-face
  567. (hl-line ((t (:background "gray10")))))
  568. ;;;;;; Simple
  569. (use-package simple ; Use correct italic font with Fira Code
  570. :ensure nil
  571. :custom-face
  572. (italic ((t (:family "Fira Code Italic"
  573. :foundry "Fira Code Italic")))))
  574. ;;;;;; Autorevert
  575. (use-package autorevert ; Update files changed on disk automatically
  576. :init
  577. (global-auto-revert-mode t)
  578. :config
  579. (setq auto-revert-remote-files t))
  580. ;;;;;; Elisp
  581. (use-package elisp-mode
  582. :ensure nil
  583. :config
  584. (setq eval-expression-print-length nil ; No size limit for displaying objects
  585. eval-expression-print-level nil) ; No depth limit for displaying lists
  586. :general
  587. (:keymaps 'emacs-lisp-mode-map
  588. :states 'normal
  589. "RET" 'eval-defun)
  590. (:keymaps 'emacs-lisp-mode-map
  591. :states 'insert
  592. [(control return)] 'eval-print-last-sexp)
  593. (:keymaps 'emacs-lisp-mode-map
  594. :states 'visual
  595. "RET" '(lambda (start end)
  596. (interactive "r")
  597. (eval-region start end t))))
  598. ;;;;;; Help
  599. (use-package help-mode
  600. :ensure nil
  601. :config
  602. (add-to-list 'display-buffer-alist '("*Help*"
  603. (display-buffer-reuse-window display-buffer-in-side-window)
  604. (side . left)
  605. (window-width . 80)
  606. (reusable-frames . nil)))
  607. :general
  608. (spcleader
  609. "h" '(:ignore t :which-key "Help")
  610. "hh" 'help-for-help
  611. "ha" 'apropos-command
  612. "hb" 'counsel-descbinds
  613. "hv" 'counsel-describe-variable
  614. "hf" 'counsel-describe-function
  615. "ho" 'helpful-at-point
  616. "hm" 'describe-mode
  617. "hp" 'finder-by-keyword
  618. "hP" 'describe-package
  619. "hk" 'helpful-key
  620. "hK" 'Info-goto-emacs-key-command-node
  621. "hi" 'info
  622. "hF" 'counsel-faces
  623. "hc" 'counsel-colors-emacs
  624. "hL" 'describe-language-environment
  625. "hl" '((lambda () (interactive) (view-buffer-other-window "*Emacs Log*"))
  626. :which-key "View input logs"))
  627. (:keymaps 'help-mode-map
  628. :states 'normal
  629. "TAB" 'forward-button
  630. "q" 'kill-buffer-and-window
  631. "P" 'help-go-back
  632. "N" 'help-go-forward)
  633. :hook (help-mode . (lambda ()
  634. (setq buffer-face-mode-face '(:background "#102030"))
  635. (buffer-face-mode 1))))
  636. ;;;;;; Markdown
  637. (use-package markdown-mode
  638. :config
  639. (setq markdown-asymmetric-header t)
  640. :custom-face
  641. (markdown-header-face-1 ((t (:inherit 'outline-1))))
  642. (markdown-header-face-2 ((t (:inherit 'outline-2))))
  643. (markdown-header-face-3 ((t (:inherit 'outline-3))))
  644. (markdown-header-face-4 ((t (:inherit 'outline-4))))
  645. (markdown-header-face-5 ((t (:inherit 'outline-5))))
  646. (markdown-bold-face ((t (:foreground "#ede0ce"))))
  647. (markdown-italic-face ((t (:foreground "#ede0ce"))))
  648. (markdown-header-delimiter-face ((t (:foreground "gray30")))))
  649. ;;;;;; Eshell
  650. (defun maxx/eshell-keys ()
  651. "Eshell-mode-map is not populated outside of eshell.
  652. So we need to define bindings in a hook."
  653. (evil-define-key*
  654. 'insert
  655. eshell-mode-map
  656. "ð" 'eshell-previous-matching-input-from-input
  657. "ß" 'eshell-next-matching-input-from-input
  658. "þ" 'eshell-backward-argument
  659. "®" 'eshell-forward-argument
  660. "Þ" 'eshell-kill-input
  661. "Ð" 'eshell-previous-prompt
  662. "ẞ" 'eshell-next-prompt
  663. "C-l" 'eshell/clear)
  664. )
  665. (use-package eshell
  666. :config
  667. (setq eshell-scroll-to-bottom-on-input t)
  668. (add-to-list 'evil-insert-state-modes 'eshell-mode)
  669. :hook (eshell-first-time-mode . maxx/eshell-keys))
  670. ;;;;;; Zoom
  671. (use-package face-remap
  672. :config
  673. (defhydra hydra-zoom (:color red)
  674. "Zoom"
  675. ("+" text-scale-increase)
  676. ("-" text-scale-decrease)
  677. ("/" (text-scale-adjust 0) "Reset"))
  678. :general
  679. (:states 'normal
  680. "C-+" 'hydra-zoom/text-scale-increase
  681. "C--" 'hydra-zoom/text-scale-decrease))
  682. ;;;;;; Calc
  683. (use-package calc
  684. :config
  685. (add-to-list 'evil-emacs-state-modes 'calc-mode))
  686. ;;;;;; Calendar
  687. (use-package calendar
  688. :config
  689. (calendar-set-date-style 'iso)
  690. (defvar holiday-french-holidays
  691. '((holiday-fixed 1 1 "Jour de l'an")
  692. (holiday-fixed 1 6 "Épiphanie")
  693. (holiday-fixed 2 2 "Chandeleur")
  694. (holiday-fixed 2 14 "Saint Valentin")
  695. (holiday-fixed 5 1 "Fête du travail")
  696. (holiday-fixed 5 8 "Commémoration de la capitulation de l'Allemagne en 1945")
  697. (holiday-fixed 6 21 "Fête de la musique")
  698. (holiday-fixed 7 14 "Fête nationale - Prise de la Bastille")
  699. (holiday-fixed 8 15 "Assomption (Religieux)")
  700. (holiday-fixed 11 11 "Armistice de 1918")
  701. (holiday-fixed 11 1 "Toussaint")
  702. (holiday-fixed 11 2 "Commémoration des fidèles défunts")
  703. (holiday-fixed 12 25 "Noël")
  704. (holiday-easter-etc 0 "Pâques") ; fetes a date variable
  705. (holiday-easter-etc 1 "Lundi de Pâques")
  706. (holiday-easter-etc 39 "Ascension")
  707. (holiday-easter-etc 49 "Pentecôte")
  708. (holiday-easter-etc 50 "Lundi de la Pentecôte")
  709. (holiday-easter-etc -47 "Mardi gras")
  710. (holiday-float 5 0 -1 "Fête des mères")
  711. (holiday-float 6 0 3 "Fête des pères")))
  712. (setq calendar-week-start-day 1
  713. calendar-holidays holiday-french-holidays
  714. calendar-mark-holidays-flag t
  715. calendar-mark-diary-entries-flag t
  716. calendar-view-diary-initially-flag t
  717. calendar-view-holidays-initially-flag t
  718. calendar-left-margin 4)
  719. (add-to-list 'display-buffer-alist '("^\\*Calendar\\*"
  720. (display-buffer-reuse-window display-buffer-in-side-window)
  721. (side . top)
  722. (window-height . 12)
  723. (reusable-frames . nil)))
  724. :general
  725. (:keymaps 'calendar-mode-map
  726. :states 'normal
  727. "q" 'calendar-exit
  728. "RET" 'diary-view-entries
  729. "ð" 'calendar-backward-week
  730. "ß" 'calendar-forward-week
  731. "þ" 'calendar-backward-day
  732. "®" 'calendar-forward-day
  733. "Þ" '(lambda ()
  734. (interactive)
  735. (calendar-backward-month 1)
  736. (calendar-scroll-right))
  737. "™" '(lambda ()
  738. (interactive)
  739. (calendar-forward-month 1)
  740. (calendar-scroll-left))
  741. "Ð" 'calendar-backward-year
  742. "ẞ" 'calendar-forward-year
  743. "T" 'calendar-goto-today
  744. "D" 'calendar-goto-date))
  745. ;;;;;; Diary
  746. (use-package diary-lib
  747. :config
  748. (setq diary-number-of-entries 7
  749. diary-file "~/Projects/diary")
  750. (add-to-list 'display-buffer-alist '("\\*Holidays\\*"
  751. (display-buffer-reuse-window display-buffer-in-side-window)
  752. (side . top)
  753. (slot . 1)
  754. (window-height . 12)
  755. (reusable-frames . nil)))
  756. (add-to-list 'display-buffer-alist '("\\*Fancy Diary Entries\\*"
  757. (display-buffer-reuse-window display-buffer-in-side-window)
  758. (side . top)
  759. (slot . -1)
  760. (window-height . 12)
  761. (reusable-frames . nil)))
  762. :hook (diary-list-entries . diary-sort-entries)
  763. :custom-face
  764. (diary ((t (:foreground "black" :background "limegreen"))))
  765. (org-agenda-diary ((t (:foreground "DarkTurquoise")))))
  766. ;;;;;; Winner
  767. (use-package winner ; Undo-redo window configuration
  768. :demand
  769. :init
  770. (winner-mode 1)
  771. :general
  772. ("C-c u" 'winner-undo
  773. "C-c U" 'winner-redo))
  774. ;;;;;; Dired
  775. (use-package dired
  776. :ensure nil
  777. :config
  778. (setq wdired-allow-to-change-permissions t
  779. dired-dwim-target t)
  780. :general
  781. (:keymaps 'dired-mode-map
  782. :states 'normal
  783. "d" 'dired-previous-line
  784. "s" 'dired-next-line
  785. "S" 'dired-sort-toggle-or-edit
  786. "t" 'dired-up-directory
  787. "r" 'dired-find-alternate-file
  788. "m" 'dired-mark
  789. "RET" 'dired-find-alternate-file
  790. "X" 'dired-do-flagged-delete
  791. "x" 'dired-flag-file-deletion
  792. "W" 'wdired-change-to-wdired-mode
  793. "q" 'kill-buffer-and-window)
  794. :hook (dired-mode . all-the-icons-dired-mode))
  795. ;;;;;; Tramp
  796. (use-package tramp
  797. :config
  798. (setq tramp-terminal-type "tramp"
  799. tramp-default-method "ssh"
  800. tramp-encoding-shell "/bin/bash"
  801. tramp-default-remote-shell "/bin/bash"
  802. tramp-connection-timeout 5))
  803. ;;;;;; Subword
  804. (use-package subword ; Word commands understand camelCase
  805. :init
  806. (global-subword-mode))
  807. ;;;;;; Hideshow
  808. (use-package hideshow ; Code folding
  809. :hook (prog-mode . hs-minor-mode))
  810. ;;;;;; Minibuffer
  811. (use-package minibuffer
  812. :ensure nil
  813. :general
  814. (:keymaps 'read-expression-map
  815. "ð" 'previous-line-or-history-element
  816. "ß" 'next-line-or-history-element
  817. "<delete>" 'delete-char))
  818. ;;;;;; electric-pair
  819. (use-package electric
  820. :config
  821. (electric-pair-mode))
  822. ;;;;; Auto-insert
  823. (defun autoinsert-yas-expand ()
  824. "Replace text in yasnippet template."
  825. (yas-expand-snippet (buffer-string) (point-min) (point-max)))
  826. (use-package autoinsert ; Auto insert content when creating a new file
  827. :init
  828. (auto-insert-mode)
  829. :config
  830. (setq auto-insert-directory (locate-user-emacs-file "templates"))
  831. (define-auto-insert "\\.Rmd$" ["template.Rmd" autoinsert-yas-expand])
  832. :hook (find-file . auto-insert))
  833. ;;;;; Undo-tree
  834. (use-package undo-tree
  835. :demand
  836. :init
  837. (global-undo-tree-mode 1)
  838. :config
  839. (setq undo-tree-auto-save-history nil
  840. undo-tree-history-directory-alist nil
  841. undo-tree-enable-undo-in-region t)
  842. (add-to-list 'display-buffer-alist '("*undo-tree" ; Undo-tree is displayed in a side window
  843. (display-buffer-reuse-window display-buffer-in-side-window)
  844. (side . left)
  845. (window-width . 0.15)
  846. (reusable-frames . nil)))
  847. (defun undo-tree-visualizer-show-diff (&optional node) ; Redefine to use a side-window instead of splitting window,
  848. "Show visualizer diff display." ; as a side-window can't be split further
  849. (setq undo-tree-visualizer-diff t)
  850. (let ((buff (with-current-buffer undo-tree-visualizer-parent-buffer
  851. (undo-tree-diff node)))
  852. (display-buffer-mark-dedicated 'soft))
  853. (display-buffer-in-side-window buff '((side . left)
  854. (slot . 1)))))
  855. :general
  856. (spcleader "u" 'undo-tree-visualize)
  857. (:keymaps 'undo-tree-visualizer-mode-map
  858. :states 'normal
  859. "q" 'undo-tree-visualizer-quit
  860. "SPC u" 'undo-tree-visualizer-quit
  861. "d" 'undo-tree-visualize-undo
  862. "s" 'undo-tree-visualize-redo
  863. "D" 'undo-tree-visualizer-toggle-diff))
  864. ;;;;; Avy
  865. (use-package avy ; Jump anywhere with <spc><spc>
  866. :config
  867. (setq avy-keys '(?t ?s ?r ?n)
  868. avy-background t
  869. avy-highlight-first t)
  870. :general
  871. (spcleader
  872. "SPC" '(avy-goto-char-timer :which-key "Avy"))
  873. :custom-face
  874. (avy-goto-char-timer-face ((t (:background nil :foreground "red2" :weight bold))))
  875. (avy-lead-face ((t (:background nil :foreground "red1"))))
  876. (avy-lead-face-0 ((t (:background nil :foreground "red4"))))
  877. (avy-lead-face-1 ((t (:background nil :foreground "red4"))))
  878. (avy-lead-face-2 ((t (:background nil :foreground "red4")))))
  879. ;;;;; Ace-link
  880. (use-package ace-link ; Links shortcuts
  881. :general
  882. (:keymaps '(Info-mode-map
  883. help-mode-map
  884. helpful-mode-map
  885. org-mode-map)
  886. :states 'normal
  887. "f" 'ace-link)
  888. (:keymaps '(gnus-summary-mode-map
  889. mu4e-view-mode-map
  890. gnus-article-mode-map)
  891. :states 'normal
  892. "f" 'ace-link-gnus))
  893. ;;;;; All the icons
  894. (use-package all-the-icons-ivy-rich
  895. :init
  896. (all-the-icons-ivy-rich-mode))
  897. (use-package all-the-icons-dired
  898. :init
  899. (all-the-icons-dired-mode))
  900. ;;;;; Doom
  901. ;;;;;; Doom theme
  902. (use-package doom-themes
  903. :config
  904. (load-theme 'doom-peacock t)
  905. (setq doom-themes-enable-bold t
  906. doom-themes-enable-italic t)
  907. (doom-themes-visual-bell-config))
  908. ;;;;;; Doom modeline
  909. (use-package doom-modeline
  910. :config
  911. (setq doom-modeline-enable-word-count t
  912. doom-modeline-icon t)
  913. ;; first time run M-x all-the-icons-install-fonts
  914. :hook (after-init . doom-modeline-mode))
  915. ;;;;; Expand region
  916. (use-package expand-region ; Expand/contract visually selected region
  917. :config
  918. (defhydra hydra-expand-region (:color red)
  919. "Expand-region"
  920. ("e" er/expand-region)
  921. ("E" er/contract-region))
  922. :general
  923. (spcleader
  924. "e" 'hydra-expand-region/er/expand-region
  925. "E" 'hydra-expand-region/er/contract-region))
  926. ;;;;; Minions
  927. (use-package minions ; Hide minor modes from modeline
  928. :init
  929. (minions-mode t)
  930. :config
  931. (setq minions-mode-line-lighter ""))
  932. ;;;;; Helpful
  933. (use-package helpful ; Featureful help mode
  934. :demand
  935. :config
  936. (setq counsel-describe-function-function 'helpful-callable ; Use helpful as backend for counsel describe
  937. counsel-describe-variable-function 'helpful-variable
  938. helpful-max-buffers 1) ; use only one buffer for help
  939. (add-to-list 'display-buffer-alist '("^\\*helpful"
  940. (display-buffer-reuse-window display-buffer-in-side-window)
  941. (side . left)
  942. (window-width . 80)
  943. (reusable-frames . nil)))
  944. :general
  945. (:keymaps 'helpful-mode-map
  946. :states 'normal
  947. "TAB" 'forward-button
  948. "q" 'kill-buffer-and-window)
  949. :hook (helpful-mode . (lambda ()
  950. (setq buffer-face-mode-face '(:background "#102030"))
  951. (buffer-face-mode 1)))
  952. :custom-face
  953. (helpful-heading ((t (:height 1.9)))))
  954. ;;;;; Fira Code
  955. (use-package fira-code-mode ; Use Fira Code and ligatures
  956. ;; run fira-code-mode-install-fonts to install the font
  957. ;; Br = base-right, Bl = base-left, Bc = base-center
  958. ;; rule = (global-ref . new-ref)
  959. ;; where global-ref is a position on the already existing glyph
  960. ;; new-ref is the position within the glyph to insert
  961. ;; Here, a first space is composed with two more spaces
  962. ;; appending the base left of each space anchored to the base right of the whole glyph
  963. ;; Then the triangle is added at the base center
  964. :hook
  965. (prog-mode . (lambda ()
  966. (push '("%>%"
  967. ?\s
  968. (Br . Bl) ?\s
  969. (Br . Bl) ?\s
  970. (Bc . Bl) 57653)
  971. prettify-symbols-alist)
  972. (fira-code-mode))))
  973. ;;;;; Rainbow mode
  974. (use-package rainbow-mode ; Show colors
  975. :demand
  976. :init
  977. (rainbow-mode))
  978. ;;;;; Doc view
  979. (use-package doc-view ; Display documents (pdf, docx, etc)
  980. :config
  981. (setq doc-view-continuous t
  982. doc-view-resolution 200)
  983. :general
  984. (:keymaps 'doc-view-mode-map
  985. :states 'normal
  986. "d" 'doc-view-previous-line-or-previous-page
  987. "s" 'doc-view-next-line-or-next-page
  988. "ð" 'doc-view-previous-page
  989. "ß" 'doc-view-next-page
  990. "gg" 'doc-view-first-page
  991. "G" 'doc-view-last-page
  992. "q" 'kill-buffer-and-window
  993. "+" 'doc-view-enlarge
  994. "-" 'doc-view-shrink))
  995. ;;;;; Image Mode
  996. (use-package image ; Display images
  997. :ensure nil
  998. :config
  999. (setq image-animate-loop t)
  1000. :general
  1001. (:keymaps 'image-mode-map
  1002. :states 'normal
  1003. "d" '(lambda () (interactive) (image-scroll-down 1))
  1004. "s" '(lambda () (interactive) (image-scroll-up 1))
  1005. "t" '(lambda () (interactive) (image-scroll-right 1))
  1006. "r" '(lambda () (interactive) (image-scroll-left 1))
  1007. "+" 'image-increase-size
  1008. "-" 'image-decrease-size
  1009. "{" 'image-decrease-speed
  1010. "}" 'image-increase-speed
  1011. "," 'image-previous-frame
  1012. "." 'image-next-frame
  1013. "RET" 'image-toggle-animation
  1014. "l" 'image-rotate
  1015. "v" '(lambda () (interactive) (image-transform-set-rotation (- image-transform-rotation 90)))
  1016. "q" 'kill-buffer-and-window))
  1017. ;;;;; Woman
  1018. (use-package woman ; Man pages
  1019. :general
  1020. (:keymaps 'woman-mode-map
  1021. :states 'normal
  1022. "ß" 'Man-next-section
  1023. "ð" 'Man-previous-section
  1024. "q" 'kill-buffer-and-window))
  1025. ;;;;; Literate Calc Mode
  1026. (use-package literate-calc-mode
  1027. :config
  1028. (defalias 'calcFunc-conv 'math-convert-units))
  1029. ;;;;; Emacs log
  1030. (use-package interaction-log ; Log all emacs actions in *Emacs Log*
  1031. :config
  1032. (interaction-log-mode))
  1033. ;;;;; Paredit
  1034. (use-package paredit ; Semantic navigation in lisp
  1035. :general
  1036. (:keymaps '(slime-parent-map emacs-lisp-mode-map)
  1037. :states 'normal
  1038. "®" '(lambda () (interactive) (paredit-forward) (paredit-forward) (paredit-backward))
  1039. "þ" 'paredit-backward
  1040. "ð" 'paredit-backward-up
  1041. "ß" 'paredit-forward-down)
  1042. :hook (emacs-lisp-mode . paredit-mode)
  1043. (slime-mode . paredit-mode))
  1044. ;;;; Completion
  1045. ;;;;; Ivy
  1046. ;;;;;; Ivy
  1047. (use-package ivy
  1048. :config
  1049. (setf (alist-get 'counsel-describe-function ivy-initial-inputs-alist) "" ; Start with empty regex for describe function and variable
  1050. (alist-get 'org-refile ivy-initial-inputs-alist) ""
  1051. (alist-get 'counsel-describe-variable ivy-initial-inputs-alist) ""
  1052. (alist-get 'org-capture-refile ivy-initial-inputs-alist) "")
  1053. (setq ivy-wrap t
  1054. ivy-height 15
  1055. ivy-use-virtual-buffers t
  1056. ivy-count-format "(%d/%d) "
  1057. ivy-extra-directories nil
  1058. ivy-re-builders-alist '((t . ivy--regex-ignore-order))
  1059. ivy-switch-buffer-faces-alist '((dired-mode . ivy-subdir))
  1060. completing-read-function 'ivy-completing-read) ; Use ivy as completion everywhere
  1061. :general
  1062. (:keymaps '(ivy-mode-map ivy-minibuffer-map)
  1063. "ð" 'ivy-previous-line
  1064. "ß" 'ivy-next-line
  1065. "C-ß" '(lambda ()
  1066. (interactive)
  1067. (scroll-other-window 1))
  1068. "C-ð" '(lambda ()
  1069. (interactive)
  1070. (scroll-other-window -1))
  1071. "®" 'ivy-partial-or-done
  1072. "þ" '(lambda ()
  1073. (interactive)
  1074. (kill-buffer (ivy-state-current ivy-last)))
  1075. "†" 'maxx/counsel-describe
  1076. "S-RET" 'ivy-call))
  1077. ;;;;;; Counsel
  1078. (use-package smex ; Show recently called M-x commands on top
  1079. :init
  1080. (setq smex-history-length 15))
  1081. (use-package counsel
  1082. :config
  1083. (setq counsel-yank-pop-preselect-last t)
  1084. :general
  1085. (spcleader
  1086. "i" 'counsel-imenu
  1087. "f" 'counsel-find-file
  1088. "b" 'switch-to-buffer
  1089. "x" 'counsel-M-x
  1090. "/" 'counsel-grep-or-swiper)
  1091. ("M-x" 'counsel-M-x)
  1092. (:states '(normal motion)
  1093. ":" 'counsel-M-x))
  1094. (defun maxx/counsel-describe ()
  1095. "Display help for object at point in counsel."
  1096. (interactive)
  1097. (let ((inhibit-message t)
  1098. (object (intern (ivy-state-current ivy-last))))
  1099. (describe-symbol object)))
  1100. ;;;;;; Ivy-rich
  1101. (use-package ivy-rich
  1102. :config
  1103. (plist-put ivy-rich-display-transformers-list
  1104. 'counsel-switch-buffer
  1105. '(:columns ((ivy-rich-candidate (:width 30))
  1106. (ivy-rich-switch-buffer-size (:width 7))
  1107. (ivy-rich-switch-buffer-indicators (:width 4 :face error :align right))
  1108. (ivy-rich-switch-buffer-major-mode (:width 12 :face warning))
  1109. (ivy-rich-switch-buffer-project (:width 15 :face success))
  1110. (ivy-rich-switch-buffer-path (:width (lambda (x) (ivy-rich-switch-buffer-shorten-path x (ivy-rich-minibuffer-width 0.3))))))
  1111. :predicate (lambda (cand) (get-buffer cand))))
  1112. (ivy-rich-mode 1))
  1113. ;;;;; Company
  1114. (use-package company
  1115. :demand
  1116. :init
  1117. (global-company-mode t)
  1118. :config
  1119. (setq company-idle-delay 0
  1120. tab-always-indent 'complete
  1121. company-selection-wrap-around t
  1122. company-dabbrev-downcase nil
  1123. company-dabbrev-ignore-case nil
  1124. company-dabbrev-code-ignore-case t
  1125. company-tooltip-align-annotations t
  1126. company-minimum-prefix-length 2
  1127. company-backends '(company-capf
  1128. company-clang
  1129. company-elisp
  1130. company-lua
  1131. company-files
  1132. (company-dabbrev-code company-gtags company-etags company-keywords)))
  1133. :general
  1134. (:states 'insert
  1135. "TAB" 'company-indent-or-complete-common)
  1136. (:keymaps 'company-active-map
  1137. "ß" 'company-select-next
  1138. "ð" 'company-select-previous
  1139. "Ð" 'company-previous-page
  1140. "ẞ" 'company-next-page
  1141. "þ" 'company-abort
  1142. "®" 'company-complete
  1143. "†" 'company-show-doc-buffer))
  1144. ;;;;; YASnippet
  1145. (use-package yasnippet
  1146. :init
  1147. (yas-global-mode))
  1148. ;;;; Org
  1149. ;;;;; Org
  1150. (use-package org
  1151. :demand
  1152. :config
  1153. (org-babel-do-load-languages ; Supported languages in babel
  1154. 'org-babel-load-languages
  1155. '((python . t)
  1156. (R . t)
  1157. (emacs-lisp . t)
  1158. (shell . t)
  1159. (plantuml . t)))
  1160. (setq org-catch-invisible-edits 'smart
  1161. org-directory "~/Projects/org" ; Folders
  1162. org-local-agenda-files (--filter
  1163. (not (s-contains-p "archive" it))
  1164. (directory-files-recursively
  1165. "~/Projects/org"
  1166. "\.org$"
  1167. nil
  1168. (lambda (filename) (not (s-contains-p "archive" filename)))))
  1169. org-agenda-files (if (ignore-errors (file-exists-p "/ssh:android@home:Org/anniv.org"))
  1170. (cons "/ssh:android@home:Org/anniv.org" (cons "/ssh:android@home:Org/calendar.org" org-local-agenda-files))
  1171. org-local-agenda-files)
  1172. org-default-notes-file "~/Projects/org/notes.org"
  1173. org-archive-location "::* Archived"
  1174. org-attach-method 'mv ; Move Attachments
  1175. org-attach-store-link-p t
  1176. org-startup-folded 'content ; Startup
  1177. org-startup-with-inline-images t
  1178. org-startup-indented t
  1179. org-edit-src-content-indentation 0
  1180. org-startup-truncated t
  1181. org-hide-emphasis-markers t
  1182. org-hide-block-startup nil
  1183. org-use-sub-superscripts '{} ; Org sub/superscript behavior
  1184. org-export-with-sub-superscripts '{}
  1185. org-pretty-entities t
  1186. org-pretty-entities-include-sub-superscripts t
  1187. org-M-RET-may-split-line nil ; RET behavior
  1188. org-return-follows-link nil
  1189. org-image-actual-width nil
  1190. ;; org-id-link-to-org-use-id t ; Generate UUIDs for links when storing link
  1191. org-html-checkbox-type 'unicode
  1192. org-enforce-todo-checkbox-dependencies nil ; Make todos dependent
  1193. org-checkbox-hierarchical-statistics nil ; Recursive checkbox statistics
  1194. org-enforce-todo-dependencies t
  1195. org-log-into-drawer t ; Log states
  1196. org-hierarchical-todo-statistics nil ; Recursive todo statistics
  1197. org-todo-keywords '((sequence "SOMEDAY(s)" "TODO(t)" "WAITING(w@)" "|" "DONE(d!)" "CANCELED(c@)")) ; Todo keywords
  1198. org-todo-keyword-faces ; Colors for TODOS
  1199. '(("TODO" . "red")
  1200. ("WAITING" . "orange")
  1201. ("CANCELED" . (:strike-through t :foreground "DimGrey" :weight bold)))
  1202. org-export-with-toc nil ; Do not create a TOC
  1203. org-export-with-section-numbers nil ; Do not number sections
  1204. org-export-preserve-breaks t ; Respect line breaks in exports
  1205. org-refile-targets '((nil :maxlevel . 9) ; REFILE
  1206. (org-agenda-files :maxlevel . 9))
  1207. org-refile-use-outline-path 'full-file-path
  1208. org-outline-path-complete-in-steps nil
  1209. org-imenu-depth 4) ; Deeper org-imenu search
  1210. ;;;;;; Capture templates
  1211. (setq org-capture-templates
  1212. '(("t" "todo"
  1213. entry (file+headline org-default-notes-file "Tasks")
  1214. "* TODO %^{todo}\n\n%?"
  1215. :empty-lines 1
  1216. :prepend t)
  1217. ("n" "note"
  1218. entry (file+headline org-default-notes-file "Notes")
  1219. "* %^{title}\n\n%?"
  1220. :empty-lines 1
  1221. :prepend t)
  1222. ("m" "reu"
  1223. entry (file "/ssh:android@home:Org/calendar.org")
  1224. "* %^{Meeting}\nSCHEDULED: %^t\n\n%?"
  1225. :empty-lines 1
  1226. :prepend t)
  1227. ("pp" "CPP"
  1228. entry (file+headline "~/Projects/org/CPP.org" "Séances")
  1229. "* Séance %^T\n\n%a\n\n%c"
  1230. :prepend t
  1231. :unnarrowed t
  1232. :empty-lines 1)))
  1233. (add-to-list 'display-buffer-alist '("*Org Agenda*" ; Org windows
  1234. (display-buffer-reuse-window display-buffer-in-side-window)
  1235. (side . right)
  1236. (window-width . 70)
  1237. (reusable-frames . nil)))
  1238. (defface org-checkbox-done-text ; Strike-through for checked boxes
  1239. '((t (:foreground "DimGrey" :strike-through t)))
  1240. "Face for text of checked boxes")
  1241. (font-lock-add-keywords
  1242. 'org-mode
  1243. `(("^[ \t]*\\(?:[-+*]\\|[0-9]+[).]\\)[ \t]+\\(\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\(?:X\\|\\([0-9]+\\)/\\2\\)\\][^\n]*\n\\)"
  1244. 1 'org-checkbox-done-text prepend))
  1245. 'append)
  1246. (if (equal (system-name) "hegp-laptop") ; Use Zathura for PDFs and xournal on hegp-laptop
  1247. (setq org-file-apps '((auto-mode . emacs)
  1248. ("\\.mm\\'" . default)
  1249. ("\\.x?html?\\'" . default)
  1250. ("\\.pdf\\'" . "xournalpp %s")
  1251. ("\\.odt\\'" . "libreoffice %s")
  1252. ("\\.docx\\'" . "libreoffice %s")
  1253. ("\\.doc\\'" . "libreoffice %s")))
  1254. (setq org-file-apps '((auto-mode . emacs)
  1255. ("\\.mm\\'" . default)
  1256. ("\\.x?html?\\'" . default)
  1257. ("\\.pdf\\'" . "zathura %s")
  1258. ("\\.odt\\'" . "libreoffice %s")
  1259. ("\\.docx\\'" . "libreoffice %s")
  1260. ("\\.doc\\'" . "libreoffice %s"))))
  1261. :general ; Menu keybindings
  1262. (spcleader
  1263. "o" '(:ignore t :which-key "Org")
  1264. "oa" 'org-agenda
  1265. "oA" 'org-store-agenda-views
  1266. "oc" 'projectorg/counsel-org-capture
  1267. "ol" 'org-insert-link
  1268. "oL" 'org-store-link
  1269. "oi" 'org-toggle-inline-images
  1270. "oS" 'org-sort
  1271. "o*" 'org-toggle-heading
  1272. "o/" 'org-sparse-tree
  1273. "o|" 'org-table-create-or-convert-from-region
  1274. "oE" 'org-table-edit-field
  1275. "oe" 'org-export-dispatch
  1276. "o}" 'org-table-toggle-coordinate-overlays
  1277. "o{" 'org-table-toggle-formula-debugger
  1278. "o?" 'org-table-field-info
  1279. "o=" 'org-table-eval-formula
  1280. "oD" 'org-insert-drawer
  1281. "ot" 'org-todo
  1282. "op" 'org-set-property
  1283. "oP" 'org-tree-slide-mode
  1284. "oC" 'org-columns
  1285. "of" 'org-footnote-action
  1286. "oj" 'org-attach
  1287. "ow" 'org-refile
  1288. "oz" 'org-archive-subtree
  1289. "o." 'org-time-stamp
  1290. "os" 'org-schedule
  1291. "od" 'org-deadline
  1292. "o." 'org-time-stamp
  1293. "ob" 'org-ref-helm-insert-cite-link
  1294. "oK" 'org-agenda-exit
  1295. "oB" 'org-insert-structure-template)
  1296. (:keymaps 'org-mode-map ; Normal keybindings
  1297. :states 'normal
  1298. "RET" 'org-open-at-point
  1299. "gt" 'org-mark-ring-goto
  1300. "<tab>" 'org-cycle
  1301. "S-<tab>" 'org-global-cycle
  1302. "M-s" 'org-metadown
  1303. "M-d" 'org-metaup
  1304. "M-r" 'org-metaright
  1305. "M-t" 'org-metaleft
  1306. "M-S" 'org-shiftmetadown
  1307. "M-D" 'org-shiftmetaup
  1308. "M-R" 'org-shiftmetaright
  1309. "M-T" 'org-shiftmetaleft
  1310. "C-s" 'org-shiftdown
  1311. "C-d" 'org-shiftup
  1312. "C-r" 'org-shiftright
  1313. "C-t" 'org-shiftleft
  1314. "©" 'org-babel-next-src-block
  1315. "ſ" 'org-babel-previous-src-block)
  1316. (:keymaps 'org-mode-map ; Insert keybindings
  1317. :states '(normal insert)
  1318. "Þ" 'outline-up-heading
  1319. "Ð" 'outline-backward-same-level
  1320. "ẞ" 'outline-forward-same-level
  1321. "þ" 'outshine-kbd-M-<left>
  1322. "®" 'outshine-kbd-M-<right>
  1323. "ð" 'org-previous-visible-heading
  1324. "ß" 'org-next-visible-heading
  1325. "<C-return>" 'org-insert-heading-after-current
  1326. "M-t" 'org-metaleft
  1327. "M-r" 'org-metaright)
  1328. :hook (org-mode . (lambda () ; Pretty checkboxes
  1329. (push '("[ ]" . "☐") prettify-symbols-alist)
  1330. (push '("[X]" . "☑" ) prettify-symbols-alist)
  1331. (push '("[-]" . "☒" ) prettify-symbols-alist)
  1332. (setq-local prettify-symbols-unprettify-at-point 'right-edge)
  1333. (prettify-symbols-mode)))
  1334. :custom-face
  1335. (highlight ((t (:background nil :foreground nil :box (:line-width 2 :color "dim gray") :DistantForeground nil))))
  1336. (outline-1 ((t (:height 1.9 :background nil))))
  1337. (outline-2 ((t (:height 1.6))))
  1338. (outline-3 ((t (:height 1.4))))
  1339. (outline-4 ((t (:height 1.2))))
  1340. (outline-5 ((t (:height 1.1)))))
  1341. (require 'org-tempo)
  1342. ;;;;; Org Agenda
  1343. (defun maxx/org-agenda-sort-strategy (a b)
  1344. "Sort todo based on which I want to see first.
  1345. A is compared to B."
  1346. (when-let ((state-a (get-text-property 14 'todo-state a))
  1347. (state-b (get-text-property 14 'todo-state b))
  1348. (cmp (--map (cl-position-if (lambda (x)
  1349. (equal x it))
  1350. '("TODO" "WAITING" "SOMEDAY" "CANCELED" "DONE"))
  1351. (list state-a state-b))))
  1352. (cond ((apply '> cmp) 1)
  1353. ((apply '< cmp) -1)
  1354. (t nil))))
  1355. (use-package org-agenda
  1356. :ensure nil
  1357. :config
  1358. (setq
  1359. org-agenda-dim-blocked-tasks 'invisible ; Hide blocked todos from agenda
  1360. org-agenda-window-setup 'current-window ; Agenda window
  1361. org-agenda-restore-windows-after-quit t
  1362. org-agenda-span 10 ; Agenda for 10 days from 1 day before
  1363. org-agenda-start-day "-1d"
  1364. org-agenda-include-diary t
  1365. org-agenda-skip-unavailable-files t
  1366. org-agenda-tags-column -78
  1367. org-agenda-remove-tags t
  1368. org-agenda-start-with-follow-mode t
  1369. org-agenda-todo-ignore-scheduled 'all
  1370. org-agenda-todo-ignore-deadlines 'near
  1371. org-agenda-skip-scheduled-if-done t
  1372. org-agenda-skip-deadline-if-done t
  1373. org-agenda-skip-scheduled-if-deadline-is-shown 'repeated-after-deadline
  1374. org-agenda-skip-timestamp-if-done t
  1375. org-agenda-skip-deadline-prewarning-if-scheduled t
  1376. org-agenda-cmp-user-defined 'maxx/org-agenda-sort-strategy
  1377. org-agenda-time-grid '((daily today require-timed remove-match)
  1378. (0000 0600 1200 1800 2359)
  1379. " "
  1380. "-------------------")
  1381. org-agenda-scheduled-leaders '("Scheduled: "
  1382. "+%2d d: ")
  1383. org-agenda-deadline-leaders '("Deadline: "
  1384. "In %2d d: "
  1385. "%2d d ago: ")
  1386. org-agenda-sorting-strategy
  1387. '((agenda time-up deadline-up priority-down)
  1388. (todo user-defined-up priority-down)
  1389. (tags priority-down category-keep)
  1390. (search category-keep))
  1391. org-agenda-custom-commands
  1392. '(("n" "Agenda and TODOs"
  1393. ((agenda "")
  1394. (alltodo ""))
  1395. ((org-enforce-todo-dependencies nil)
  1396. (org-agenda-skip-function
  1397. '(org-agenda-skip-entry-if 'regexp ":notes:"))))
  1398. ("N" "Local agenda and TODOs"
  1399. ((agenda "")
  1400. (alltodo ""))
  1401. ((org-agenda-files org-local-agenda-files)
  1402. (org-agenda-skip-function
  1403. '(org-agenda-skip-entry-if 'regexp ":notes:"))))
  1404. ("x" "Agenda for export" ; Use org-store-agenda-views to automatically export this view
  1405. ((agenda ""))
  1406. ((org-agenda-start-day "+0d")
  1407. (org-agenda-skip-function
  1408. '(org-agenda-skip-entry-if 'regexp ":notes:"))))
  1409. ("X" "Local agenda export for orgzly"
  1410. ((agenda "" ))
  1411. ((org-agenda-span 'month)
  1412. (org-deadline-past-days 0)
  1413. (org-agenda-remove-timeranges-from-blocks t)
  1414. (org-agenda-files org-local-agenda-files))
  1415. ("/ssh:android@home:Org_exported/exported.org"))
  1416. ("M" "PS export for reMarkable"
  1417. ((agenda ""))
  1418. ((org-agenda-start-day "+0d")
  1419. (org-enforce-todo-dependencies nil)
  1420. (org-agenda-skip-function
  1421. '(org-agenda-skip-entry-if 'regexp ":notes:")))
  1422. ("/tmp/agenda_export.ps"))))
  1423. :general ; Agenda keybindings
  1424. (:keymaps 'org-agenda-mode-map
  1425. :states '(normal)
  1426. "q" 'org-agenda-quit
  1427. "C-d" 'org-agenda-priority-up
  1428. "C-s" 'org-agenda-priority-down
  1429. "i" 'org-agenda-diary-entry
  1430. "T" 'org-agenda-todo
  1431. "ß" 'org-agenda-next-item
  1432. "ð" 'org-agenda-previous-item
  1433. "RET" 'org-agenda-goto
  1434. "®" 'org-agenda-goto
  1435. "_" 'org-agenda-cycle-show
  1436. "C" 'org-agenda-columns
  1437. "Ð" 'org-agenda-earlier
  1438. "ẞ" 'org-agenda-later
  1439. "u" 'org-agenda-redo-all
  1440. "S" 'org-agenda-schedule
  1441. "D" 'org-agenda-deadline))
  1442. ;;;;; Org notifications
  1443. (use-package org-wild-notifier
  1444. :config
  1445. (setq alert-default-style 'libnotify)
  1446. ;; (org-wild-notifier-mode)
  1447. )
  1448. ;;;;; Org-bullets
  1449. (use-package org-bullets
  1450. :config
  1451. (setq org-hide-leading-stars t)
  1452. :hook (org-mode . org-bullets-mode))
  1453. ;;;;; Org fancy priorities
  1454. (use-package org-fancy-priorities
  1455. :config
  1456. (setq org-priority-faces ; Set colors
  1457. '((?A . "#ff5d38")
  1458. (?B . "orange")
  1459. (?C . "#98be65")))
  1460. (setq org-fancy-priorities-list ; Set chars
  1461. '((?A . "⬆")
  1462. (?B . "·")
  1463. (?C . "⬇")))
  1464. :hook (org-mode . org-fancy-priorities-mode))
  1465. ;;;;; Outshine
  1466. (use-package outshine
  1467. :config
  1468. (outshine-define-key outshine-mode-map
  1469. (kbd "þ")
  1470. 'outshine-hide-more
  1471. (outline-on-heading-p))
  1472. (outshine-define-key outshine-mode-map
  1473. (kbd "®") 'outshine-show-more
  1474. (outline-on-heading-p))
  1475. (outshine-define-key outshine-mode-map
  1476. (kbd "ð") 'outline-previous-visible-heading
  1477. (outline-on-heading-p))
  1478. (outshine-define-key outshine-mode-map
  1479. (kbd "ß") 'outline-next-visible-heading
  1480. (outline-on-heading-p))
  1481. :general
  1482. (:keymaps 'outshine-mode-map
  1483. :states 'normal
  1484. "<tab>" 'outshine-cycle
  1485. "S-<tab>" 'outshine-cycle-buffer
  1486. [(control return)] 'outshine-insert-heading
  1487. "ð" 'outshine-kbd-ð
  1488. "ß" 'outshine-kbd-ß
  1489. "Ð" 'outline-backward-same-level
  1490. "ẞ" 'outline-forward-same-level
  1491. "Þ" 'outline-up-heading
  1492. "þ" 'outshine-kbd-þ
  1493. "®" 'outshine-kbd-®
  1494. "M-t" 'outshine-kbd-M-S-<left>
  1495. "M-r" 'outshine-kbd-M-S-<right>
  1496. "M-d" 'outshine-kbd-M-S-<up>
  1497. "M-s" 'outshine-kbd-M-S-<down>)
  1498. :hook (emacs-lisp-mode . outshine-mode))
  1499. ;;;;; Org-ref
  1500. (use-package org-ref
  1501. :config
  1502. (setq org-ref-bibliography-notes "~/Projects/org/bib_notes.org"
  1503. org-ref-pdf-directory "~/Projects/org/biblio/PDFs/"
  1504. org-ref-completion-library 'org-ref-ivy-cite
  1505. org-latex-pdf-process
  1506. '("pdflatex -interaction nonstopmode -output-directory %o %f"
  1507. "bibtex %b"
  1508. "pdflatex -interaction nonstopmode -output-directory %o %f"
  1509. "pdflatex -interaction nonstopmode -output-directory %o %f"))
  1510. ;; org-latex-pdf-process '("latexmk -shell-escape -bibtex -f -pdf %f"))
  1511. :general
  1512. (:keymaps 'helm-map
  1513. "ð" 'helm-previous-line
  1514. "ß" 'helm-next-line)
  1515. (:keymaps 'bibtex-mode-map
  1516. "ð" 'org-ref-bibtex-previous-entry
  1517. "ß" 'org-ref-bibtex-next-entry)
  1518. (:keymaps 'bibtex-mode-map
  1519. :states 'normal
  1520. "RET" 'org-ref-bibtex-hydra/body))
  1521. ;;;;; Calfw
  1522. (use-package calfw ; Calendar view for org agenda
  1523. :config
  1524. (setq
  1525. cfw:fchar-junction ?╋ ; Unicode characters
  1526. cfw:fchar-vertical-line ?┃
  1527. cfw:fchar-horizontal-line ?━
  1528. cfw:fchar-left-junction ?┣
  1529. cfw:fchar-right-junction ?┫
  1530. cfw:fchar-top-junction ?┯
  1531. cfw:fchar-top-left-corner ?┏
  1532. cfw:fchar-top-right-corner ?┓
  1533. cfw:render-line-breaker 'cfw:render-line-breaker-wordwrap ; Word wrap
  1534. cfw:org-capture-template '("z")) ; Capture template
  1535. (add-to-list 'org-capture-templates
  1536. '("z" ""
  1537. entry (file "/ssh:android@home:Org/calendar.org")
  1538. "* %^{Meeting}\n SCHEDULED: %(cfw:org-capture-day)\n%?"
  1539. :empty-lines 1
  1540. :prepend t))
  1541. (add-to-list 'display-buffer-alist '("*cfw-calendar*"
  1542. (display-buffer-reuse-window display-buffer-in-side-window)
  1543. (side . top)
  1544. (slot . 1)
  1545. (window-width . 0.4)
  1546. (reusable-frames . nil)))
  1547. :general
  1548. (:keymaps 'cfw:calendar-mode-map
  1549. :states 'normal
  1550. "s" 'cfw:navi-next-week-command
  1551. "d" 'cfw:navi-previous-week-command
  1552. "t" 'cfw:navi-previous-day-command
  1553. "r" 'cfw:navi-next-day-command
  1554. "RET" 'cfw:org-onclick
  1555. "SPC" 'cfw:org-open-agenda-day
  1556. "þ" 'cfw:navi-previous-month-command
  1557. "®" 'cfw:navi-next-month-command
  1558. "ð" 'cfw:navi-prev-item-command
  1559. "ß" 'cfw:navi-next-item-command
  1560. "M" 'cfw:change-view-month
  1561. "W" 'cfw:change-view-week
  1562. "D" 'cfw:change-view-day
  1563. "c" 'cfw:org-capture
  1564. "u" 'cfw:refresh-calendar-buffer))
  1565. (use-package calfw-org)
  1566. ;;;;; Org-tree-slide
  1567. (use-package org-tree-slide
  1568. :general
  1569. (:keymaps 'org-tree-slide-mode-map
  1570. :states 'normal
  1571. "ð" 'org-tree-slide-move-previous-tree
  1572. "ß" 'org-tree-slide-move-next-tree))
  1573. ;;;; Project management
  1574. ;;;;; Projectile
  1575. (use-package projectile
  1576. :config
  1577. (projectile-clear-known-projects)
  1578. (setq projectile-completion-system 'ivy
  1579. projectile-track-known-projects-automatically nil
  1580. projectile-auto-discover nil
  1581. projectile-ignored-project-function 'file-remote-p
  1582. projectile-project-types nil
  1583. projectile-project-root-files nil
  1584. projectile-project-root-files-top-down-recurring nil
  1585. projectile-project-root-files-bottom-up '(".git")))
  1586. ;;;;; Counsel-projectile
  1587. (use-package counsel-projectile)
  1588. ;;;;; Perspectives
  1589. (use-package persp-mode
  1590. :demand
  1591. :after doom-modeline
  1592. :init
  1593. (persp-mode)
  1594. :config
  1595. (setq persp-kill-foreign-buffer-behaviour 'kill ;Allow killing buffers that are not in the persp
  1596. persp-set-last-persp-for-new-frames nil ;Do not restore the current persp in a new frame
  1597. persp-init-new-frame-behaviour-override nil ;and let us set initial-buffer-choice
  1598. persp-auto-save-persps-to-their-file nil ;and not save perspectives!
  1599. persp-auto-save-opt 0
  1600. persp-auto-save-num-of-backups nil
  1601. persp-save-dir nil
  1602. persp-autokill-persp-when-removed-last-buffer 'kill-auto)
  1603. ;; Customize appearance of the perspective widget
  1604. (defface persp-selected-face ; Face for current persp
  1605. '((t (:weight bold :foreground "Blue")))
  1606. "The face used to highlight the current perspective on the modeline.")
  1607. (defun persp-intersperse (list interspersed-val) ; Helper function to intersperse a separator
  1608. "Intersperse a value into a list.
  1609. Return a new list made from taking LIST and inserting
  1610. INTERSPERSED-VAL between every pair of items.
  1611. For example, (persp-intersperse '(1 2 3) 'a) gives '(1 a 2 a 3)."
  1612. (reverse
  1613. (cl-reduce
  1614. (lambda (list el) (if list (cl-list* el interspersed-val list) (list el)))
  1615. list :initial-value nil)))
  1616. (defun persp-format-name (name) ; Apply persp-selected-face if current persp
  1617. "Format the perspective name given by NAME for display in the mode line or header line."
  1618. (let ((string-name (format "%s" name)))
  1619. (if (equal name (safe-persp-name (get-current-persp)))
  1620. (propertize string-name 'face 'persp-selected-face)
  1621. (propertize string-name 'face 'persp-face-lighter-nil-persp))))
  1622. (defun doom-modeline-update-persp-name (&rest _) ; Override doom modeline function with the one from perspective.el
  1623. "Update perspective name in mode-line."
  1624. (setq doom-modeline--persp-name
  1625. (append '("[")
  1626. (persp-intersperse (mapcar 'persp-format-name (persp-names-sorted)) "|")
  1627. '("]")))))
  1628. ;;;;; Projectorg
  1629. (quelpa '(projectorg :fetcher git :url "me:projectorg"))
  1630. (use-package projectorg
  1631. :load-path "~/.config/emacs/quelpa/build/projectorg"
  1632. :demand
  1633. :config
  1634. (setq projectorg/projects-root "/home/maxx/Projects/"
  1635. projectorg/org-dir "org/"
  1636. projectorg/projects-file (concat projectorg/projects-root projectorg/org-dir "projects.org")
  1637. initial-buffer-choice projectorg/projects-file)
  1638. (setq projectorg/counsel-org-capture-templates ; Per-project capture templates
  1639. `(("tp"
  1640. "[${name}] Todo"
  1641. entry (file+headline ,(concat projectorg/projects-root projectorg/org-dir "${name}.org") "Tasks")
  1642. "* TODO %^{todo}\n\n%a\n\n%?"
  1643. :empty-lines 1
  1644. :prepend t)
  1645. ("np"
  1646. "[${name}] Note"
  1647. entry (file+headline ,(concat projectorg/projects-root projectorg/org-dir "${name}.org") "Notes")
  1648. "* %^{title}\n\n%?"
  1649. :empty-lines 1
  1650. :prepend t)))
  1651. :general
  1652. (spcleader
  1653. "p" '(:ignore t :which-key "Projectile")
  1654. "pf" 'counsel-projectile-find-file
  1655. "po" 'projectorg/go-to-notes
  1656. "pO" 'projectorg/go-to-inbox
  1657. "pc" '((lambda () (interactive)
  1658. (find-file-other-window "/ssh:android@home:Org/calendar.org"))
  1659. :which-key "Go to calendar file")
  1660. "pb" 'persp-switch-to-buffer
  1661. "pp" 'persp-switch
  1662. "pg" 'counsel-projectile-grep
  1663. "pr" 'projectile-replace-regexp
  1664. "pk" 'projectorg/remove-from-project-list
  1665. "p SPC" '((lambda () (interactive)
  1666. (persp-switch "none")
  1667. (delete-other-windows)
  1668. (find-file projectorg/projects-file))
  1669. :which-key "Go to projects")))
  1670. ;;;; Jump to definition
  1671. ;; Define another version of xref-find-definitions for indirect buffer.
  1672. (defun xref-find-definitions-indirect-buffer (identifier)
  1673. "Like `xref-find-definitions' but switch to an indirect buffer in a new window."
  1674. (interactive (list (xref--read-identifier "Find definitions of: ")))
  1675. (xref--find-definitions identifier 'indirect))
  1676. ;; Re-implement xref--pop-to-location with 'indirect option.
  1677. (defun xref--pop-to-location (item &optional action)
  1678. "Go to the location of ITEM and display the buffer.
  1679. ACTION controls how the buffer is displayed:
  1680. nil -- switch-to-buffer
  1681. `window' -- pop-to-buffer (other window)
  1682. `frame' -- pop-to-buffer (other frame)
  1683. `indirect' -- pop-to-indirect-buffer (other window)
  1684. If SELECT is non-nil, select the target window."
  1685. (let* ((marker (save-excursion
  1686. (xref-location-marker (xref-item-location item))))
  1687. (buf (marker-buffer marker)))
  1688. (cl-ecase action
  1689. ((nil) (progn (switch-to-buffer buf) (xref--goto-char marker)))
  1690. (window (progn (pop-to-buffer buf t) (xref--goto-char marker)))
  1691. (frame (let ((pop-up-frames t))
  1692. (pop-to-buffer buf t)
  1693. (xref--goto-char marker)))
  1694. (indirect (let* ((newname (generate-new-buffer-name "fundef"))
  1695. (buf (make-indirect-buffer buf newname)))
  1696. (pop-to-buffer buf t)
  1697. (xref--goto-char marker)
  1698. (narrow-to-defun)))))
  1699. (let ((xref--current-item item))
  1700. (run-hooks 'xref-after-jump-hook)))
  1701. (use-package dumb-jump
  1702. :config
  1703. (setq dumb-jump-selector 'ivy)
  1704. (add-to-list 'dumb-jump-language-file-exts '(:language "elisp" :ext "org" :agtype "elisp" :rgtype "elisp"))
  1705. :general
  1706. (spcleader
  1707. "d" 'xref-find-definitions-other-window)
  1708. :hook (ess-r-mode . (lambda () (add-to-list 'xref-backend-functions 'dumb-jump-xref-activate)))
  1709. (poly-markdown+r-mode . (lambda () (add-to-list 'xref-backend-functions 'dumb-jump-xref-activate)))
  1710. (poly-org-mode . (lambda () (add-to-list 'xref-backend-functions 'dumb-jump-xref-activate)))
  1711. (slime-mode . (lambda () (add-to-list 'xref-backend-functions 'dumb-jump-xref-activate))))
  1712. ;;;; CSV mode
  1713. (use-package csv-mode)
  1714. ;;;; Lua
  1715. ;;;;; Lua-mode
  1716. (use-package lua-mode)
  1717. ;;;;; Company-lua
  1718. (use-package company-lua)
  1719. ;;;;; fennel-mode
  1720. (use-package fennel-mode
  1721. :config
  1722. (add-to-list 'auto-mode-alist '("\\.fnl\\'" . fennel-mode)))
  1723. ;;;; ESS
  1724. ;;;;; ESS
  1725. (use-package ess
  1726. :config
  1727. (setq ess-ask-for-ess-directory nil
  1728. comint-scroll-to-bottom-on-input t
  1729. comint-scroll-to-bottom-on-output t
  1730. ess-use-ido nil
  1731. ess-style 'RStudio
  1732. ess-eldoc-show-on-symbol t)
  1733. (add-to-list 'evil-insert-state-modes 'comint-mode)
  1734. (add-to-list 'display-buffer-alist '("*R Dired"
  1735. (display-buffer-reuse-window display-buffer-in-side-window)
  1736. (side . right)
  1737. (slot . 1)
  1738. (window-width . 0.2)
  1739. (reusable-frames . nil)))
  1740. (add-to-list 'display-buffer-alist '("\\*Help\\[R"
  1741. (display-buffer-reuse-window display-buffer-in-side-window)
  1742. (side . right)
  1743. (window-width . 0.4)
  1744. (reusable-frames . nil)))
  1745. (add-to-list 'display-buffer-alist '("*R"
  1746. (display-buffer-reuse-window display-buffer-in-side-window)
  1747. (window-height . 0.3)
  1748. (reusable-frames . nil)))
  1749. :general
  1750. (spcleader
  1751. "r" '(:ignore t :which-key "R")
  1752. "rh" 'ess-display-help-on-object
  1753. "rH" 'ess-handy-commands
  1754. "rc" 'polymode-eval-region-or-chunk
  1755. "ra" 'polymode-eval-buffer-from-beg-to-point
  1756. "rs" 'ess-switch-process
  1757. "rq" 'ess-quit
  1758. "rd" '(:ignore t :which-key "roxygen Documentation")
  1759. "rdd" 'ess-roxy-update-entry
  1760. "rdh" 'ess-roxy-preview-HTML
  1761. "rdt" 'ess-roxy-preview-text)
  1762. (:keymaps 'ess-r-mode-map
  1763. :states 'normal
  1764. "RET" 'ess-eval-line-and-step)
  1765. (:keymaps 'ess-r-mode-map
  1766. :states 'visual
  1767. "RET" 'ess-eval-region)
  1768. (:keymaps 'ess-r-mode-map
  1769. :states 'insert
  1770. "»" '(lambda () (interactive) (insert "%>%"))
  1771. " " '(lambda () (interactive) (insert " ")))
  1772. (:keymaps 'ess-r-help-mode-map
  1773. :states 'normal
  1774. "q" 'kill-buffer-and-window
  1775. "TAB" 'forward-button
  1776. "ð" 'ess-skip-to-previous-section
  1777. "ß" 'ess-skip-to-next-section)
  1778. (:keymaps 'inferior-ess-r-mode-map
  1779. :states 'insert
  1780. "TAB" 'company-complete
  1781. "C-l" 'comint-clear-buffer
  1782. "þ" 'comint-kill-input
  1783. "ð" 'comint-previous-matching-input-from-input
  1784. "ß" 'comint-next-matching-input-from-input
  1785. "»" '(lambda () (interactive) (insert "%>%"))
  1786. " " '(lambda () (interactive) (insert " ")))
  1787. (:keymaps 'inferior-ess-r-mode-map
  1788. :states '(insert normal)
  1789. "C-d" 'evil-scroll-line-up
  1790. "C-s" 'evil-scroll-line-down)
  1791. (:keymaps 'inferior-ess-r-mode-map
  1792. :states 'normal
  1793. "ð" 'comint-previous-prompt
  1794. "ß" 'comint-next-prompt)
  1795. :hook
  1796. (comint-mode . (lambda () (setq-local scroll-margin 0))) ; Display console output without margin
  1797. (ess-r-help-mode . (lambda ()
  1798. (setq buffer-face-mode-face '(:background "#102030"))
  1799. (buffer-face-mode 1))))
  1800. ;;;;; Poly-R
  1801. (use-package poly-R
  1802. :general
  1803. (spcleader
  1804. "r" '(:ignore t :which-key "R")
  1805. "rc" 'polymode-eval-region-or-chunk
  1806. "ra" 'polymode-eval-buffer-from-beg-to-point
  1807. "re" 'polymode-export
  1808. "rE" 'polymode-set-exporter)
  1809. (:keymaps '(markdown-mode-map)
  1810. :states 'normal
  1811. "<tab>" 'markdown-cycle
  1812. "ð" 'markdown-previous-visible-heading
  1813. "ß" 'markdown-next-visible-heading
  1814. "Ð" 'markdown-outline-previous-same-level
  1815. "ẞ" 'markdown-outline-next-same-level
  1816. "þ" 'outline-hide-subtree
  1817. "®" '(lambda () (interactive)
  1818. (outline-show-children)
  1819. (outline-show-entry))
  1820. "Þ" 'markdown-up-heading
  1821. "©" 'polymode-next-chunk
  1822. "ſ" 'polymode-previous-chunk
  1823. "M-r" 'markdown-demote
  1824. "M-t" 'markdown-promote
  1825. "M-d" 'markdown-move-up
  1826. "M-s" 'markdown-move-down))
  1827. ;;;; Git
  1828. ;;;;; Magit
  1829. (use-package magit
  1830. :config
  1831. (setq magit-status-goto-file-position t
  1832. magit-popup-show-help-echo nil
  1833. magit-clone-default-directory projectorg/projects-root
  1834. magit-clone-set-remote.pushDefault t)
  1835. (add-to-list 'evil-emacs-state-modes 'magit-mode)
  1836. (add-to-list 'evil-emacs-state-modes 'git-rebase-mode)
  1837. (add-to-list 'display-buffer-alist '("magit"
  1838. (display-buffer-reuse-window display-buffer-in-side-window)
  1839. (side . left)
  1840. (window-width . 80)
  1841. (reusable-frames . nil)))
  1842. (add-to-list 'display-buffer-alist '("magit-revision"
  1843. (display-buffer-reuse-window display-buffer-in-side-window)
  1844. (side . left)
  1845. (slot . 1)
  1846. (window-height . .5)
  1847. (window-width . 80)
  1848. (reusable-frames . nil)))
  1849. (add-to-list 'display-buffer-alist '("magit-diff"
  1850. (display-buffer-reuse-window display-buffer-in-side-window)
  1851. (side . left)
  1852. (slot . 1)
  1853. (window-height . .5)
  1854. (window-width . 80)
  1855. (reusable-frames . nil)))
  1856. :general
  1857. (spcleader
  1858. "g" '(:ignore t :which-key "Magit")
  1859. "gd" 'magit-dispatch
  1860. "gf" 'magit-file-dispatch
  1861. "gs" 'magit-status)
  1862. (:keymaps '(magit-hunk-section-map
  1863. magit-file-section-map
  1864. magit-mode-map
  1865. magit-staged-section-map
  1866. magit-unstaged-section-map
  1867. magit-revision-mode-map
  1868. magit-section-map
  1869. magit-refs-mode-map
  1870. magit-log-mode-map
  1871. magit-diff-mode-map
  1872. magit-untracked-section-map
  1873. magit-status-mode-map
  1874. magit-stash-section-map)
  1875. "ð" 'magit-section-backward
  1876. "ß" 'magit-section-forward
  1877. "þ" 'magit-section-hide
  1878. "®" 'magit-section-show
  1879. "s" 'magit-next-line
  1880. "d" 'magit-previous-line
  1881. "q" 'kill-buffer-and-window)
  1882. (:keymaps '(magit-hunk-section-map
  1883. magit-status-mode-map
  1884. magit-unstaged-section-map
  1885. magit-untracked-section-map)
  1886. "+" 'magit-stage
  1887. "-" 'magit-unstage))
  1888. ;;;;; Magit-annex
  1889. (use-package magit-annex)
  1890. ;;;;; Magit-todos
  1891. (use-package magit-todos
  1892. :init
  1893. (magit-todos-mode))
  1894. ;;;;; Smerge
  1895. (use-package smerge-mode
  1896. :general
  1897. (:keymaps 'smerge-mode-map
  1898. :states 'normal
  1899. "RET" 'smerge-keep-current
  1900. "n" 'smerge-next
  1901. "p" 'smerge-prev))
  1902. ;;;;; Git-gutter-fringe
  1903. (use-package git-gutter-fringe
  1904. :init
  1905. (global-git-gutter-mode t))
  1906. ;;;; Elpy
  1907. (use-package elpy
  1908. :init
  1909. ;; (elpy-enable)
  1910. )
  1911. ;;;; Slime
  1912. (use-package slime-company
  1913. :after (slime company)
  1914. :config
  1915. (slime-setup '(slime-fancy slime-company))
  1916. (setq slime-company-completion 'fuzzy
  1917. slime-company-after-completion 'slime-company-just-one-space)
  1918. :general
  1919. (:keymaps 'company-active-map
  1920. "ß" 'company-select-next
  1921. "ð" 'company-select-previous
  1922. "†" 'company-show-doc-buffer
  1923. "¿" 'company-show-location))
  1924. (use-package slime
  1925. :config
  1926. (setq inferior-lisp-program "sbcl")
  1927. (add-to-list 'evil-emacs-state-modes 'sldb-mode)
  1928. :general
  1929. (:keymaps 'slime-parent-map
  1930. :states 'normal
  1931. "RET" 'slime-eval-defun)
  1932. (:keymaps 'sldb-mode-map
  1933. "ð" 'sldb-up
  1934. "d" 'sldb-up
  1935. "Ð" 'sldb-details-up
  1936. "ß" 'sldb-down
  1937. "s" 'sldb-down
  1938. "ẞ" 'sldb-details-down
  1939. " " 'sldb-step
  1940. "®" 'sldb-toggle-details
  1941. "þ" 'sldb-toggle-details
  1942. "RET" 'sldb-show-source)
  1943. (:keymaps 'slime-repl-mode-map
  1944. :states 'insert
  1945. "TAB" 'company-complete
  1946. "ð" 'slime-repl-previous-input
  1947. "ß" 'slime-repl-next-input
  1948. "þ" 'slime-repl-kill-input
  1949. "C-l" 'slime-repl-clear-buffer)
  1950. (:keymaps 'slime-repl-mode-map
  1951. :states 'normal
  1952. "ð" 'slime-repl-previous-prompt
  1953. "ß" 'slime-repl-next-prompt)
  1954. (:keymaps 'slime-repl-mode-map
  1955. :states '(insert normal)
  1956. "C-d" 'evil-scroll-line-up
  1957. "C-s" 'evil-scroll-line-down))
  1958. ;;;; Flycheck
  1959. (use-package flycheck
  1960. :init
  1961. (global-flycheck-mode))
  1962. ;;;; Mu4e
  1963. ;;;;; Mu4e
  1964. (use-package mu4e
  1965. :demand
  1966. :load-path "/usr/share/emacs/site-lisp/mu4e/"
  1967. :config
  1968. (add-to-list 'evil-emacs-state-modes 'mu4e-main-mode)
  1969. (setq mu4e-sent-folder "/Inbox" ; Folders
  1970. mu4e-drafts-folder "/Drafts"
  1971. mu4e-trash-folder "/Trash")
  1972. (setq mu4e-maildir-shortcuts ; and their shortcuts
  1973. '(("/Inbox" . ?i)
  1974. ("/Archives" . ?a)
  1975. ("/Trash" . ?t)
  1976. ("/Junk" . ?j)
  1977. ("/Sent" . ?s)
  1978. ("/Drafts" . ?d)))
  1979. (cond ((equal (system-name) "hegp") ; Mail accounts
  1980. (setq mu4e-get-mail-command "mbsync aphp"
  1981. mu4e-refile-folder "/Local_archive"
  1982. mu4e-maildir-shortcuts '(("/Inbox" . ?i)
  1983. ("/Local_archive" . ?a)
  1984. ("/Trash" . ?t)
  1985. ("/Junk" . ?j)
  1986. ("/Sent" . ?s)
  1987. ("/Drafts" . ?d))))
  1988. ((or (equal (system-name) "tablet")
  1989. (equal (system-name) "hegp-laptop")
  1990. (equal (system-name) "hnv-laptop"))
  1991. (setq mu4e-get-mail-command "mbsync free"
  1992. mu4e-refile-folder "/Archives")))
  1993. (setq mu4e-view-prefer-html t ; Display html by default
  1994. mu4e-update-interval 300 ; Fetch emails every 5 minutes
  1995. mu4e-headers-auto-update t ; Auto update list of emails after update
  1996. mu4e-compose-signature-auto-include nil ; org-msg has its own signature
  1997. mu4e-compose-format-flowed t
  1998. mu4e-attachment-dir "~/Downloads"
  1999. mu4e-compose-in-new-frame nil
  2000. mu4e-view-show-images t
  2001. mu4e-headers-sort-direction 'ascending
  2002. mu4e-confirm-quit nil
  2003. mu4e-change-filenames-when-moving t ; Required by mbsync
  2004. message-kill-buffer-on-exit t ; Discard editing buffer when message is sent
  2005. mu4e-compose-dont-reply-to-self t
  2006. mu4e-completing-read-function 'ivy-completing-read
  2007. mu4e-split-view 'vertical
  2008. mu4e-headers-visible-columns 95
  2009. mu4e-headers-include-related nil ; Hide related messages by default
  2010. mu4e-headers-skip-duplicates t ; and skip duplicates
  2011. mu4e-headers-results-limit 500
  2012. mu4e-index-cleanup t ; Keep mu index clean
  2013. mu4e-index-lazy-check nil
  2014. mail-user-agent 'mu4e-user-agent
  2015. mu4e-compose-reply-recipients 'all ; Reply to all by default
  2016. mu4e-view-show-addresses t ; Always show email addresses
  2017. mu4e-use-fancy-chars t ; Use fancy chars
  2018. mu4e-headers-thread-first-child-prefix '("o " . "├ ")
  2019. mu4e-headers-thread-last-child-prefix '("L " . "└ ")
  2020. mu4e-headers-attach-mark '("a" . "")
  2021. mu4e-headers-visible-flags '(attach encrypted signed))
  2022. (setq mm-text-html-renderer 'gnus-w3m)
  2023. (setq mu4e-headers-fields ; Define headers
  2024. '((:thread-subject . 50)
  2025. (:from-or-to . 20)
  2026. (:human-date . 11)
  2027. (:flags . 4)))
  2028. (when (fboundp 'imagemagick-register-types) ; Use imagemagick to view images, if available
  2029. (imagemagick-register-types))
  2030. :general
  2031. (:keymaps 'mu4e-main-mode-map
  2032. "'" 'mu4e~headers-jump-to-maildir)
  2033. (:keymaps 'mu4e-headers-mode-map
  2034. :states 'normal
  2035. "ð" 'mu4e-headers-prev
  2036. "ß" 'mu4e-headers-next
  2037. "RET" 'mu4e-headers-view-message
  2038. "®" 'mu4e-headers-view-message
  2039. "q" 'mu4e~headers-quit-buffer
  2040. "x" 'mu4e-headers-mark-for-trash
  2041. "a" 'mu4e-headers-mark-for-refile
  2042. "u" 'mu4e-headers-mark-for-unmark
  2043. "l" 'mu4e-headers-mark-for-trash
  2044. "U" 'mu4e-mark-unmark-all
  2045. "X" 'mu4e-mark-execute-all
  2046. "W" 'mu4e-headers-toggle-include-related
  2047. "C" 'mu4e-compose-new
  2048. "F" 'mu4e-compose-forward
  2049. "R" 'mu4e-compose-reply
  2050. "m" 'mu4e-update-mail-and-index
  2051. "o" 'mu4e-headers-change-sorting
  2052. "'" 'mu4e~headers-jump-to-maildir
  2053. "M" 'mu4e-headers-mark-for-move
  2054. "/" 'mu4e-view-search-narrow)
  2055. (:keymaps 'mu4e-headers-mode-map
  2056. :states 'visual
  2057. "l" 'mu4e-headers-mark-for-delete)
  2058. (:keymaps 'mu4e-view-mode-map
  2059. :states 'normal
  2060. "ð" 'mu4e-view-headers-prev
  2061. "ß" 'mu4e-view-headers-next
  2062. "þ" 'mu4e-select-other-view
  2063. "q" 'kill-buffer-and-window
  2064. "x" 'mu4e-view-mark-for-trash
  2065. "a" 'mu4e-view-mark-for-refile
  2066. "u" 'mu4e-view-mark-for-unmark
  2067. "l" 'mu4e-view-mark-for-trash
  2068. "U" 'mu4e-mark-unmark-all
  2069. "X" 'mu4e-mark-execute-all
  2070. "C" 'mu4e-compose-new
  2071. "F" 'mu4e-compose-forward
  2072. "R" 'mu4e-compose-reply
  2073. "m" 'mu4e-update-mail-and-index
  2074. "'" 'mu4e~headers-jump-to-maildir
  2075. "h" 'mu4e-view-toggle-html
  2076. "M" 'mu4e-view-mark-for-move
  2077. "A" 'mu4e-view-action
  2078. "J" 'mu4e-view-save-attachments))
  2079. ;;;;; Mu4e-alert
  2080. (defun maxx/mu4e-alert-notification-formatter (mail-group all-emails)
  2081. "Define a custom mu4e-alert formatter for MAIL-GROUP notification.
  2082. ALL-EMAILS are all the unread emails"
  2083. (list :title (format "%s \uf0e0" (mu4e-alert--get-group (car mail-group)))
  2084. :body ""))
  2085. (use-package mu4e-alert
  2086. :after alert
  2087. :config
  2088. (mu4e-alert-set-default-style 'libnotify)
  2089. (setq mu4e-alert-email-notification-types '(subjects))
  2090. (setq mu4e-alert-grouped-mail-notification-formatter 'maxx/mu4e-alert-notification-formatter)
  2091. (mu4e-alert-enable-notifications))
  2092. ;;;;; smtpmail
  2093. (use-package smtpmail
  2094. :config
  2095. (setq smtpmail-queue-mail nil
  2096. message-send-mail-function 'smtpmail-send-it
  2097. send-mail-function 'smtpmail-send-it)
  2098. (cond ((or (equal (system-name) "tablet") ; smtp accounts
  2099. (equal (system-name) "hegp-laptop")
  2100. (equal (system-name) "hnv-laptop"))
  2101. (setq smtpmail-smtp-server "smtp.free.fr"
  2102. user-mail-address "maximewack@free.fr"
  2103. auth-sources '("~/.authinfo.gpg")
  2104. smtpmail-smtp-service 587))
  2105. ((equal (system-name) "hegp")
  2106. (setq smtpmail-smtp-server "smtp.aphp.fr"
  2107. user-mail-address "maxime.wack@aphp.fr"
  2108. auth-sources '(password-store)
  2109. smtpmail-smtp-service 25))))
  2110. ;;;;; Org-mime
  2111. (use-package org-mime)
  2112. ;;;;; Org-msg
  2113. (use-package org-msg
  2114. :init
  2115. (org-msg-mode)
  2116. :config ; Customize signature depending on host name
  2117. (if (equal (system-name) "hegp") ; If at work, use formal signature, else just sign "Maxime"
  2118. (setq org-msg-signature "
  2119. --
  2120. Dr Maxime Wack, MSc
  2121. Assistant Hospitalo-Universitaire
  2122. Pôle Informatique et Santé Publique
  2123. Hôpital Européen Georges Pompidou
  2124. tel: 01 56 09 23 63")
  2125. (setq org-msg-signature "
  2126. --
  2127. Maxime Wack"))
  2128. (setq maxx/org-msg-style ; Message style without max-width = 100ch
  2129. '((del nil ((font-family . "\"Arial\"") ; This fixes narrow columns in message preview
  2130. (font-size . "10pt") ; in outlook webapp
  2131. (color . "grey")
  2132. (border-left . "none")
  2133. (text-decoration . "line-through")
  2134. (margin-bottom . "0px")
  2135. (margin-top . "10px")
  2136. (line-height . "11pt")))
  2137. (a nil ((color . "#0071c5")))
  2138. (a reply-header ((color . "black")
  2139. (text-decoration . "none")))
  2140. (div reply-header ((padding . "3.0pt 0in 0in 0in")
  2141. (border-top . "solid #e1e1e1 1.0pt")
  2142. (margin-bottom . "20px")))
  2143. (span underline ((text-decoration . "underline")))
  2144. (li nil ((font-family . "\"Arial\"")
  2145. (font-size . "10pt")
  2146. (line-height . "10pt")
  2147. (margin-bottom . "0px")
  2148. (margin-top . "2px")))
  2149. (nil org-ul ((list-style-type . "square")))
  2150. (nil org-ol ((font-family . "\"Arial\"")
  2151. (font-size . "10pt")
  2152. (line-height . "10pt")
  2153. (margin-bottom . "0px")
  2154. (margin-top . "0px")
  2155. (margin-left . "30px")
  2156. (padding-top . "0px")
  2157. (padding-left . "5px")))
  2158. (nil signature ((font-family . "\"Arial\"")
  2159. (font-size . "10pt")
  2160. (margin-bottom . "20px")))
  2161. (blockquote nil ((padding-left . "5px")
  2162. (margin-left . "10px")
  2163. (margin-top . "20px")
  2164. (margin-bottom . "0")
  2165. (border-left . "3px solid #ccc")
  2166. (font-style . "italic")
  2167. (background . "#f9f9f9")))
  2168. (code nil ((font-size . "10pt")
  2169. (font-family . "monospace")
  2170. (background . "#f9f9f9")))
  2171. (code src\ src-asl ((color . "unspecified-fg")
  2172. (background-color . "unspecified-bg")))
  2173. (code src\ src-c ((color . "unspecified-fg")
  2174. (background-color . "unspecified-bg")))
  2175. (code src\ src-c++ ((color . "unspecified-fg")
  2176. (background-color . "unspecified-bg")))
  2177. (code src\ src-conf ((color . "unspecified-fg")
  2178. (background-color . "unspecified-bg")))
  2179. (code src\ src-cpp ((color . "unspecified-fg")
  2180. (background-color . "unspecified-bg")))
  2181. (code src\ src-csv ((color . "unspecified-fg")
  2182. (background-color . "unspecified-bg")))
  2183. (code src\ src-diff ((color . "unspecified-fg")
  2184. (background-color . "unspecified-bg")))
  2185. (code src\ src-ditaa ((color . "unspecified-fg")
  2186. (background-color . "unspecified-bg")))
  2187. (code src\ src-emacs-lisp ((color . "unspecified-fg")
  2188. (background-color . "unspecified-bg")))
  2189. (code src\ src-fundamental ((color . "unspecified-fg")
  2190. (background-color . "unspecified-bg")))
  2191. (code src\ src-ini ((color . "unspecified-fg")
  2192. (background-color . "unspecified-bg")))
  2193. (code src\ src-json ((color . "unspecified-fg")
  2194. (background-color . "unspecified-bg")))
  2195. (code src\ src-makefile ((color . "unspecified-fg")
  2196. (background-color . "unspecified-bg")))
  2197. (code src\ src-man ((color . "unspecified-fg")
  2198. (background-color . "unspecified-bg")))
  2199. (code src\ src-org ((color . "unspecified-fg")
  2200. (background-color . "unspecified-bg")))
  2201. (code src\ src-plantuml ((color . "unspecified-fg")
  2202. (background-color . "unspecified-bg")))
  2203. (code src\ src-python ((color . "unspecified-fg")
  2204. (background-color . "unspecified-bg")))
  2205. (code src\ src-sh ((color . "unspecified-fg")
  2206. (background-color . "unspecified-bg")))
  2207. (code src\ src-xml ((color . "unspecified-fg")
  2208. (background-color . "unspecified-bg")))
  2209. (nil linenr ((padding-right . "1em")
  2210. (color . "black")
  2211. (background-color . "#aaaaaa")))
  2212. (pre nil ((line-height . "12pt")
  2213. (color . "unspecified-fg")
  2214. (background-color . "unspecified-bg")
  2215. (margin . "0px")
  2216. (font-size . "9pt")
  2217. (font-family . "monospace")))
  2218. (div org-src-container ((margin-top . "10px")))
  2219. (nil figure-number ((font-family . "\"Arial\"")
  2220. (font-size . "10pt")
  2221. (color . "#0071c5")
  2222. (font-weight . "bold")
  2223. (text-align . "left")))
  2224. (nil table-number)
  2225. (caption nil ((text-align . "left")
  2226. (background . "#0071c5")
  2227. (color . "white")
  2228. (font-weight . "bold")))
  2229. (nil t-above ((caption-side . "top")))
  2230. (nil t-bottom ((caption-side . "bottom")))
  2231. (nil listing-number ((font-family . "\"Arial\"")
  2232. (font-size . "10pt")
  2233. (color . "#0071c5")
  2234. (font-weight . "bold")
  2235. (text-align . "left")))
  2236. (nil figure ((font-family . "\"Arial\"")
  2237. (font-size . "10pt")
  2238. (color . "#0071c5")
  2239. (font-weight . "bold")
  2240. (text-align . "left")))
  2241. (nil org-src-name ((font-family . "\"Arial\"")
  2242. (font-size . "10pt")
  2243. (color . "#0071c5")
  2244. (font-weight . "bold")
  2245. (text-align . "left")))
  2246. (table nil ((font-family . "\"Arial\"")
  2247. (font-size . "10pt")
  2248. (margin-top . "0px")
  2249. (line-height . "10pt")
  2250. (border-collapse . "collapse")))
  2251. (th nil ((border . "1px solid white")
  2252. (background-color . "#0071c5")
  2253. (color . "white")
  2254. (padding-left . "10px")
  2255. (padding-right . "10px")))
  2256. (td nil ((font-family . "\"Arial\"")
  2257. (font-size . "10pt")
  2258. (margin-top . "0px")
  2259. (padding-left . "10px")
  2260. (padding-right . "10px")
  2261. (background-color . "#f9f9f9")
  2262. (border . "1px solid white")))
  2263. (td org-left ((text-align . "left")))
  2264. (td org-right ((text-align . "right")))
  2265. (td org-center ((text-align . "center")))
  2266. (div outline-text-4 ((margin-left . "15px")))
  2267. (div outline-4 ((margin-left . "10px")))
  2268. (h4 nil ((margin-bottom . "0px")
  2269. (font-size . "11pt")
  2270. (font-family . "\"Arial\"")))
  2271. (h3 nil ((margin-bottom . "0px")
  2272. (text-decoration . "underline")
  2273. (color . "#0071c5")
  2274. (font-size . "12pt")
  2275. (font-family . "\"Arial\"")))
  2276. (h2 nil ((margin-top . "20px")
  2277. (margin-bottom . "20px")
  2278. (font-style . "italic")
  2279. (color . "#0071c5")
  2280. (font-size . "13pt")
  2281. (font-family . "\"Arial\"")))
  2282. (h1 nil ((margin-top . "20px")
  2283. (margin-bottom . "0px")
  2284. (color . "#0071c5")
  2285. (font-size . "12pt")
  2286. (font-family . "\"Arial\"")))
  2287. (p nil ((text-decoration . "none")
  2288. (margin-bottom . "0px")
  2289. (margin-top . "10px")
  2290. (line-height . "11pt")
  2291. (font-size . "10pt")
  2292. (font-family . "\"Arial\"")
  2293. ;; (max-width . "100ch")
  2294. ))
  2295. (div nil ((font-family . "\"Arial\"")
  2296. (font-size . "10pt")
  2297. (line-height . "11pt")))))
  2298. (setq org-msg-enforce-css maxx/org-msg-style
  2299. org-msg-default-alternatives '((new html)
  2300. (reply-to-html html)
  2301. (reply-to-text html))))
  2302. ;;;;; Htmlize
  2303. (use-package htmlize)
  2304. ;;;; seriesTracker
  2305. (use-package seriestracker
  2306. ;; :load-path "/home/maxx/Projects/seriestracker"
  2307. :config
  2308. (setq seriestracker--fold-cycle 'seriestracker-all-unfolded)
  2309. (defun seriestracker-search-tpb ()
  2310. "Search on tpb."
  2311. (interactive)
  2312. (seriestracker--inbuffer)
  2313. (seriestracker--with-episode
  2314. ((seriesname (alist-get 'name series)))
  2315. ;; (browse-url-xdg-open (concat "https://piratebayproxy.live/search/" seriesname " S" (format "%02d" seasonN) "E" (format "%02d" episodeN)))
  2316. (browse-url-xdg-open (concat "https://thepiratebay.org/search.php?q=" seriesname " S" (format "%02d" seasonN) "E" (format "%02d" episodeN)))
  2317. ))
  2318. :general
  2319. (:keymaps 'seriestracker-mode-map
  2320. :states '(normal visual)
  2321. "d" 'seriestracker-prev-line
  2322. "s" 'seriestracker-next-line
  2323. "ð" 'seriestracker-prev
  2324. "ß" 'seriestracker-next
  2325. "Þ" 'seriestracker-up
  2326. "Ð" 'seriestracker-prev-same
  2327. "ẞ" 'seriestracker-next-same
  2328. "þ" 'seriestracker-fold-at-point
  2329. "®" 'seriestracker-unfold-at-point
  2330. "h" 'seriestracker-dispatch
  2331. "U" 'seriestracker-update
  2332. "A" 'seriestracker-search
  2333. "w" 'seriestracker-toggle-watch
  2334. "u" 'seriestracker-watch-up
  2335. "W" 'seriestracker-toggle-display-watched
  2336. "N" 'seriestracker-add-note
  2337. "q" 'seriestracker-quit
  2338. [tab] 'seriestracker-cycle
  2339. "RET" 'seriestracker-search-tpb))
  2340. ;;;; Academic writing
  2341. ;;;;; plantuml
  2342. (use-package plantuml-mode
  2343. :config
  2344. (setq plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar"
  2345. plantuml-default-exec-mode 'jar
  2346. org-plantuml-jar-path plantuml-jar-path))
  2347. ;;;;; academic-phrases
  2348. (use-package academic-phrases)
  2349. ;;;; Font Awesome
  2350. (use-package fontawesome)
  2351. ;;;; OSM
  2352. (use-package osm
  2353. :config
  2354. (setq osm-home '(48.8443 2.3199 17))
  2355. (add-to-list 'osm-server-list
  2356. '(maptiler-satellite-hybrid
  2357. :name "MapTiler Satellite Hybrid"
  2358. :description "(Non-free API)"
  2359. :max-connections 8
  2360. :url "https://api.maptiler.com/maps/hybrid/256/%z/%x/%y.jpg?key=IdeGh4b0rGWjL4i4X9Jq"))
  2361. :general
  2362. (:keymaps 'osm-mode-map
  2363. :states 'normal
  2364. "D" 'osm-up-up
  2365. "S" 'osm-down-down
  2366. "T" 'osm-left-left
  2367. "R" 'osm-right-right
  2368. "d" 'osm-up
  2369. "s" 'osm-down
  2370. "t" 'osm-left
  2371. "r" 'osm-right
  2372. "-" 'osm-zoom-out
  2373. "+" 'osm-zoom-in
  2374. "l" 'osm-zoom-out
  2375. "v" 'osm-zoom-in
  2376. "?" 'osm-search
  2377. "/" 'osm-search))
  2378. ;;;; Elfeed
  2379. (use-package elfeed
  2380. :config
  2381. (setq elfeed-feeds '("https://news.ycombinator.com/rss")
  2382. elfeed-search-title-max-width 200
  2383. elfeed-search-title-min-width 200)
  2384. :general
  2385. (:keymaps 'elfeed-search-mode-map
  2386. :states 'normal
  2387. "U" 'elfeed-update
  2388. "u" 'elfeed-search-tag-all-unread
  2389. "ð" 'evil-previous-line
  2390. "ß" 'evil-next-line
  2391. "®" 'elfeed-search-browse-url
  2392. "þ" 'elfeed-search-untag-all-unread
  2393. "q" 'elfeed-search-quit-window))