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.

1604 lines
46 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. #+TITLE: Emacs Configuration
  2. #+AUTHOR: Marc Pohling
  3. #+
  4. * Personal Information
  5. #+BEGIN_SRC emacs-lisp
  6. (setq user-full-name "Marc Pohling"
  7. user-mail-address "marc.pohling@googlemail.com")
  8. #+END_SRC
  9. I need a function to know what computer emacs is running on. The display width of 1152 pixel is an oddity of hyper-v and for my usecase specific enough to tell the machine.
  10. #+BEGIN_SRC emacs-lisp
  11. (defvar my/whoami
  12. (if (string-equal user-login-name "POH")
  13. "work_remote"
  14. (if (equal (display-pixel-width) 1152)
  15. "work_hyperv"
  16. (if (string-equal system-type "gnu/linux")
  17. "home"))))
  18. #+END_SRC
  19. * Stuff to add / to fix
  20. - smartparens
  21. a sane default configuration for navigation, manipulation etc. is still necessary
  22. - Spaceline / Powerline or similar
  23. I want a pretty status bar!
  24. - Git gutter:
  25. Do some configuration to make it useful (see given source link in the [[*Git][Section]] of gutter)
  26. Maybe only enable it for modes where it is likely I use git?
  27. - Some webmode stuff
  28. - markdown:
  29. add hooks for certain file extensions, maybe add a smart way to start gfm-mode if markdown-file is in a git-project
  30. - move package dependend configurations inside the package configuration itself, like keymaps for magit
  31. * Update config in a running config
  32. Two options:
  33. - reload the open file: M-x load-file, then press twice to accept
  34. the default filename, which is the currently opened
  35. - Point at the end of any sexp and press C-x C-e
  36. * Customize default settings
  37. Keep the .emacs.d clean by moving user files into separate directories.
  38. - user-local: directory for machine specific files
  39. - user-global: directory for files which work on any machine
  40. - the backup and auto-save files go right to /tmp
  41. #+BEGIN_SRC emacs-lisp
  42. (defvar PATH_USER_LOCAL (expand-file-name "~/.emacs.d/user-local/"))
  43. (defvar PATH_USER_GLOBAL (expand-file-name "~/.emacs.d/user-global/"))
  44. (setq bookmark-default-file (concat PATH_USER_LOCAL "bookmarks"))
  45. (setq recentf-save-file (concat PATH_USER_LOCAL "recentf"))
  46. (setq custom-file (concat PATH_USER_LOCAL "custom.el")) ;don't spam init.el with saved customize settings
  47. (setq abbrev-file-name (concat PATH_USER_GLOBAL "abbrev_defs"))
  48. (setq backup-directory-alist `((".*" . ,temporary-file-directory)))
  49. (setq auto-save-file-name-transforms `((".*" ,temporary-file-directory)))
  50. (setq save-abbrevs 'silently) ; don't bother me with asking if new abbrevs should be saved
  51. #+END_SRC
  52. These functions are useful. Activate them.
  53. #+BEGIN_SRC emacs-lisp
  54. (put 'downcase-region 'disabled nil)
  55. (put 'upcase-region 'disabled nil)
  56. (put 'narrow-to-region 'disabled nil)
  57. (put 'dired-find-alternate-file 'disabled nil)
  58. #+END_SRC
  59. Answering just 'y' or 'n' should be enough.
  60. #+BEGIN_SRC emacs-lisp
  61. (defalias 'yes-or-no-p 'y-or-n-p)
  62. #+END_SRC
  63. Don't ask me if I want to load themes.
  64. #+BEGIN_SRC emacs-lisp
  65. (setq custom-safe-themes t)
  66. #+END_SRC
  67. Don't count two spaces after a period as the end of a sentence.
  68. Just one space is needed
  69. #+BEGIN_SRC emacs-lisp
  70. (setq sentence-end-double-space nil)
  71. #+END_SRC
  72. Delete the region when typing, just like as we expect nowadays.
  73. #+BEGIN_SRC emacs-lisp
  74. (delete-selection-mode t)
  75. #+END_SRC
  76. Auto-indent when pressing RET, just new-line when C-j
  77. #+BEGIN_SRC emacs-lisp
  78. (define-key global-map (kbd "RET") 'newline-and-indent)
  79. (define-key global-map (kbd "C-j") 'newline)
  80. #+END_SRC
  81. Set the default window size depending on the system emacs is running on.
  82. ;; TODO:
  83. ;; This size is only reasonable for linux@home
  84. ;; hyperv is way smaller, use fullscreen here
  85. ;; pm should be fullscreen, too
  86. #+BEGIN_SRC emacs-lisp
  87. (if (display-graphic-p)
  88. (pcase my/whoami
  89. ("home" (progn
  90. (setq initial-frame-alist
  91. '((width . 165)
  92. (height . 70)))
  93. (setq default-frame-alist
  94. '((width . 165)
  95. (height . 70)))))
  96. ("work_remote" (add-to-list 'initial-frame-alist '(fullscreen . maximized)))
  97. ("work_hyperv" (add-to-list 'initial-frame-alist '(fullscreen . maximized)))))
  98. #+END_SRC
  99. * Visuals
  100. ** Font
  101. Don't add the font in the work environment, which I am logged in as POH
  102. #+BEGIN_SRC emacs-lisp
  103. (unless (string-equal my/whoami "work_remote")
  104. (set-face-attribute 'default nil :font "Hack-12")
  105. )
  106. #+END_SRC
  107. ** Themes
  108. *** Material Theme
  109. The [[https://github.com/cpaulik/emacs-material-theme][Material Theme]] comes in a dark and a light variant. Not too dark
  110. to be strenious though.
  111. b
  112. #+BEGIN_SRC emacs-lisp
  113. (use-package material-theme
  114. :if (window-system)
  115. :defer t
  116. :ensure t
  117. )
  118. #+END_SRC
  119. *** Apropospriate Theme
  120. Variants dark and light
  121. #+BEGIN_SRC emacs-lisp
  122. (use-package apropospriate-theme
  123. :if (window-system)
  124. :defer t
  125. :ensure t
  126. )
  127. #+END_SRC
  128. *** Ample Theme
  129. Variants:
  130. - ample
  131. - ample-flat
  132. - ample-light
  133. #+BEGIN_SRC emacs-lisp
  134. (use-package ample-theme
  135. :if (window-system)
  136. :defer t
  137. :ensure t
  138. :init
  139. (load-theme 'ample-flat t)
  140. )
  141. #+END_SRC
  142. ** Prettier Line Wraps
  143. By default there is no line wrapping. M-q actually modifies the buffer, which might not be wanted.
  144. So: enable visual wrapping and keep indentation if there are any.
  145. #+BEGIN_SRC emacs-lisp
  146. (global-visual-line-mode)
  147. (diminish 'visual-line-mode)
  148. (use-package adaptive-wrap
  149. :ensure t
  150. :init
  151. (when (fboundp 'adaptive-wrap-prefix-mode)
  152. (defun my-activate-adaptive-wrap-prefix-mode ()
  153. "Toggle `visual-line-mode' and `adaptive-wrap-prefix-mode' simultaneously."
  154. (adaptive-wrap-prefix-mode (if visual-line-mode 1 -1)))
  155. (add-hook 'visual-line-mode-hook 'my-activate-adaptive-wrap-prefix-mode))
  156. )
  157. #+END_SRC
  158. ** Mode Line
  159. Change the default mode line to something prettier. [[https://github.com/Malabarba/smart-mode-line][Source]]
  160. #+BEGIN_SRC emacs-lisp
  161. (use-package smart-mode-line
  162. :ensure t
  163. :config
  164. (tool-bar-mode -1)
  165. (setq sml/theme 'respectful)
  166. (setq sml/name-width 40)
  167. (setq sml/mode-width 'full)
  168. (set-face-attribute 'mode-line nil
  169. :box nil)
  170. (sml/setup))
  171. #+END_SRC
  172. ** Line numbers
  173. #+BEGIN_SRC emacs-lisp
  174. (use-package linum
  175. :ensure t
  176. :init
  177. (add-hook 'prog-mode-hook 'linum-mode))
  178. #+END_SRC
  179. ** Misc
  180. UTF-8 please
  181. #+BEGIN_SRC emacs-lisp
  182. (setq locale-coding-system 'utf-8)
  183. (set-terminal-coding-system 'utf-8)
  184. (set-keyboard-coding-system 'utf-8)
  185. (set-selection-coding-system 'utf-8)
  186. (prefer-coding-system 'utf-8)
  187. #+END_SRC
  188. Turn off blinking cursor
  189. #+BEGIN_SRC emacs-lisp
  190. (blink-cursor-mode -1)
  191. #+END_SRC
  192. #+BEGIN_SRC emacs-lisp
  193. (show-paren-mode t)
  194. (column-number-mode t)
  195. (setq uniquify-buffer-name-style 'forward)
  196. #+END_SRC
  197. Avoid tabs in place of multiple spaces (they look bad in TeX) and show empty lines
  198. #+BEGIN_SRC emacs-lisp
  199. (setq-default indent-tabs-mode nil)
  200. (setq-default indicate-empty-lines t)
  201. #+END_SRC
  202. Smooth scrolling. Emacs tends to be jumpy, this should change it.
  203. #+BEGIN_SRC emacs-lisp
  204. (setq scroll-margin 5
  205. scroll-conservatively 10000
  206. scroll-preserve-screen-position 1
  207. scroll-step 1)
  208. #+END_SRC
  209. Highlight current line
  210. #+BEGIN_SRC emacs-lisp
  211. (global-hl-line-mode t)
  212. #+END_SRC
  213. * Usability
  214. ** which-key
  215. Greatly increases discovery of functions!
  216. Click [[https://github.com/justbur/emacs-which-key][here]] for source and more info.
  217. Info in Emacs: M-x customize-group which-key
  218. #+BEGIN_SRC emacs-lisp
  219. (use-package which-key
  220. :ensure t
  221. :diminish which-key-mode
  222. :config
  223. (which-key-mode)
  224. (which-key-setup-side-window-right-bottom)
  225. (which-key-setup-minibuffer)
  226. (setq which-key-idle-delay 0.5)
  227. )
  228. #+END_SRC
  229. ** Recentf
  230. Activate and configure recentf
  231. #+BEGIN_SRC emacs-lisp
  232. (recentf-mode t)
  233. (setq recentf-max-saved-items 200)
  234. #+END_SRC
  235. ** Hydra
  236. Hydra allows grouping of commands
  237. #+BEGIN_SRC emacs-lisp
  238. (use-package hydra
  239. :ensure t
  240. :bind
  241. ("C-c f" . hydra-flycheck/body)
  242. ("C-c g" . hydra-git-gutter/body)
  243. :config
  244. (setq-default hydra-default-hint nil)
  245. )
  246. #+END_SRC
  247. ** Evil
  248. So... Evil Mode might be worth a try
  249. #+BEGIN_SRC emacs-lisp
  250. (use-package evil
  251. :ensure t
  252. :defer .1 ;; don't block emacs when starting, load evil immediately after startup
  253. :init
  254. (setq evil-want-integration nil) ;; required by evil-collection
  255. :config
  256. (evil-mode 1)) ;; for now deactivate per default
  257. #+END_SRC
  258. Evil-collection is a bundle of configs for different modes.
  259. 2018-05-01: evil collection causes error
  260. "Invalid function: with-helm-buffer"
  261. #+BEGIN_SRC emacs-lisp
  262. ;(use-package evil-collection
  263. ; :after evil
  264. ; :ensure t
  265. ; :config
  266. ; (evil-collection-init))
  267. #+END_SRC
  268. Evil-goggles give visual hints when editing texts, so it's more obvious what is actually happening. [[https://github.com/edkolev/evil-goggles][Source]]
  269. #+BEGIN_SRC emacs-lisp
  270. (use-package evil-goggles
  271. :after evil
  272. :ensure t
  273. :diminish evil-goggles-mode
  274. :config
  275. (evil-goggles-mode)
  276. (evil-goggles-use-diff-faces))
  277. #+END_SRC
  278. ** General (keymapper)
  279. I just use general.el to define keys and keymaps. With it I can set leader keys and create keymaps for them. It also integrates well with which-key.
  280. [[https://github.com/noctuid/general.el][Source]]
  281. #+BEGIN_SRC emacs-lisp
  282. (use-package general
  283. :ensure t
  284. )
  285. #+END_SRC
  286. ** Custom key mappings
  287. Now some keymaps.
  288. If there is no map defined, it is considered the global key map.
  289. #+BEGIN_SRC emacs-lisp
  290. (general-define-key
  291. :states '(normal visual insert emacs)
  292. :prefix "SPC"
  293. :non-normal-prefix "M-SPC"
  294. "TAB" '(ivy-switch-buffer :which-key "prev buffer")
  295. "SPC" '(counsel-M-x :which-key "M-x"))
  296. #+END_SRC
  297. A map for org-mode
  298. #+BEGIN_SRC emacs-lisp
  299. (general-define-key
  300. :states '(normal visual insert emacs)
  301. :keymaps 'org-mode-map
  302. :prefix "SPC"
  303. :non-normal-prefix "M-SPC"
  304. "t" '(counsel-org-tag :which-key "org-tag"))
  305. #+END_SRC
  306. ** List buffers
  307. Ibuffer is the improved version of list-buffers.
  308. Make ibuffer the default buffer lister. [[http://ergoemacs.org/emacs/emacs_buffer_management.html][Source]]
  309. #+BEGIN_SRC emacs-lisp
  310. (defalias 'list-buffers 'ibuffer)
  311. #+END_SRC
  312. Also auto refresh dired, but be quiet about it. [[http://whattheemacsd.com/sane-defaults.el-01.html][Source]]
  313. #+BEGIN_SRC emacs-lisp
  314. (add-hook 'dired-mode-hook 'auto-revert-mode)
  315. (setq global-auto-revert-non-file-buffers t)
  316. (setq auto-revert-verbose nil)
  317. #+END_SRC
  318. ** ivy / counsel / swiper
  319. Flx is required for fuzzy-matching
  320. Is it really necessary?
  321. BEGIN_SRC emacs-lisp
  322. (use-package flx)
  323. end_src
  324. Ivy displays a window with suggestions for hotkeys and M-x
  325. #+BEGIN_SRC emacs-lisp
  326. (use-package ivy
  327. :ensure t
  328. :diminish
  329. (ivy-mode . "") ;; does not display ivy in the mode line
  330. :init
  331. (ivy-mode 1)
  332. :bind
  333. ("C-c C-r" . ivy-resume)
  334. :config
  335. (setq ivy-use-virtual-buffers t) ;; recent files and bookmarks in ivy-switch-buffer
  336. (setq ivy-height 20) ;; height of ivy window
  337. (setq ivy-count-format "%d/%d") ;; current and total number
  338. (setq ivy-re-builders-alist ;; regex replaces spaces with *
  339. '((t . ivy--regex-plus)))
  340. )
  341. #+END_SRC
  342. The find-file replacement is nicer to navigate
  343. #+BEGIN_SRC emacs-lisp
  344. (use-package counsel
  345. :ensure t
  346. :bind* ;; load counsel when pressed
  347. (("M-x" . counsel-M-x)
  348. ("C-x C-f" . counsel-find-file)
  349. ("C-x C-r" . counsel-recentf)
  350. ("C-c C-f" . counsel-git)
  351. ("C-c h f" . counsel-describe-function)
  352. ("C-c h v" . counsel-describe-variable)
  353. ("M-i" . counsel-imenu)
  354. )
  355. )
  356. #+END_SRC
  357. Swiper ivy-enhances isearch
  358. #+BEGIN_SRC emacs-lisp
  359. (use-package swiper
  360. :ensure t
  361. :bind
  362. (("C-s" . swiper)
  363. ("C-c C-r" . ivy-resume)
  364. )
  365. )
  366. #+END_SRC
  367. Ivy-Hydra adds stuff in minibuffer when you press C-o
  368. #+BEGIN_SRC emacs-lisp
  369. (use-package ivy-hydra
  370. :ensure t)
  371. #+END_SRC
  372. ** Helm
  373. This is just a try to see how it works differently.
  374. #+BEGIN_SRC emacs-lisp
  375. (use-package helm
  376. :ensure t
  377. :init
  378. (helm-mode 1)
  379. :bind
  380. ; (("M-x" . helm-M-x)
  381. ; ("C-x C-f" . helm-find-files)
  382. ; ("C-x C-r" . helm-recentf)
  383. ; ("C-x b" . helm-buffers-list))
  384. :config
  385. (setq helm-buffers-fuzzy-matching t)
  386. )
  387. (use-package helm-descbinds
  388. :ensure t
  389. :bind
  390. ("C-h b" . helm-descbinds))
  391. (use-package helm-projectile
  392. :ensure t
  393. :config
  394. (helm-projectile-on))
  395. #+END_SRC
  396. ** Undo
  397. Show an undo tree in a new buffer which can be navigated.
  398. #+BEGIN_SRC emacs-lisp
  399. (use-package undo-tree
  400. :ensure t
  401. :diminish undo-tree-mode
  402. :init
  403. (undo-tree-mode))
  404. #+END_SRC
  405. ** Ido (currently inactive)
  406. better completion
  407. #+BEGIN_SRC emacs-lisp
  408. ;(use-package ido
  409. ; :init
  410. ; (setq ido-enable-flex-matching t)
  411. ; (setq ido-everywhere t)
  412. ; (ido-mode t)
  413. ; (use-package ido-vertical-mode
  414. ; :ensure t
  415. ; :defer t
  416. ; :init
  417. ; (ido-vertical-mode 1)
  418. ; (setq ido-vertical-define-keys 'C-n-and-C-p-only)
  419. ; )
  420. ;)
  421. #+END_SRC
  422. ** Treemacs
  423. A file manager comparable to neotree.
  424. [[https://github.com/Alexander-Miller/treemacs][Github]]
  425. It has some requirements, which gets used here anyway:
  426. - ace-window
  427. - hydra
  428. - projectile
  429. - python
  430. I copied the configuration example from the github site.
  431. No idea what this executable-find is about.
  432. TODO check it out!
  433. #+BEGIN_SRC emacs-lisp
  434. (use-package treemacs
  435. :ensure t
  436. :defer t
  437. :config
  438. (setq treemacs-change-root-without-asking nil
  439. treemacs-collapse-dirs (if (executable-find "python") 3 0)
  440. treemacs-file-event-delay 5000
  441. treemacs-follow-after-init t
  442. treemacs-follow-recenter-distance 0.1
  443. treemacs-goto-tag-strategy 'refetch-index
  444. treemacs-indentation 2
  445. treemacs-indentation-string " "
  446. treemacs-is-never-other-window nil
  447. treemacs-never-persist nil
  448. treemacs-no-png-images nil
  449. treemacs-recenter-after-file-follow nil
  450. treemacs-recenter-after-tag-follow nil
  451. treemacs-show-hidden-files t
  452. treemacs-silent-filewatch nil
  453. treemacs-silent-refresh nil
  454. treemacs-sorting 'alphabetic-desc
  455. treemacs-tag-follow-cleanup t
  456. treemacs-tag-follow-delay 1.5
  457. treemacs-width 35)
  458. (treemacs-follow-mode t)
  459. (treemacs-filewatch-mode t)
  460. (pcase (cons (not (null (executable-find "git")))
  461. (not (null (executable-find "python3"))))
  462. (`(t . t)
  463. (treemacs-git-mode 'extended))
  464. (`(t . _)
  465. (treemacs-git-mode 'simple)))
  466. :bind
  467. (:map global-map
  468. ([f8] . treemacs-toggle))
  469. )
  470. #+END_SRC
  471. Treemacs-projectile is useful for uhh.. TODO explain!
  472. #+BEGIN_SRC emacs-lisp
  473. (use-package treemacs-projectile
  474. :ensure t
  475. :defer t
  476. :config
  477. (setq treemacs-header-function #'treemacs-projectile-create-header)
  478. )
  479. #+END_SRC
  480. TODO
  481. Hydrastuff or keybindings for functions:
  482. - treemacs-projectile
  483. - treemacs-projectile-toggle
  484. - treemacs-toggle
  485. - treemacs-bookmark
  486. - treemacs-find-file
  487. - treemacs-find-tag
  488. ** Window Handling
  489. Some tools to easen the navigation, creation and deletion of windows
  490. *** Ace-Window
  491. #+BEGIN_SRC emacs-lisp
  492. (use-package ace-window
  493. :ensure t
  494. :init
  495. (global-set-key (kbd "C-x o") 'ace-window)
  496. )
  497. #+END_SRC
  498. *** Windmove
  499. Windmove easens the navigation between windows.
  500. Here we are setting the default keybindings (shift+arrow)
  501. CURRENTLY NOT WORKING, defaults are blocked.
  502. Also not sure if necessary when using ace-window.
  503. #+BEGIN_SRC emacs-lisp
  504. (use-package windmove
  505. :ensure t
  506. :config
  507. (windmove-default-keybindings)
  508. )
  509. #+END_SRC
  510. ** misc
  511. Visual feedback when using regexp on the buffer
  512. #+BEGIN_SRC emacs-lisp
  513. (use-package visual-regexp
  514. :ensure t
  515. :defer t
  516. :bind (("C-c r s" . query-replace)
  517. ("C-c r R" . vr/replace)
  518. ("C-c r r" . vr/query-replace)
  519. ("C-c r m" . vr/mc-mark)))
  520. #+END_SRC
  521. Newline at the end of file
  522. #+BEGIN_SRC emacs-lisp
  523. (setq require-final-newline t)
  524. #+END_SRC
  525. Delete the selection with a keypress
  526. #+BEGIN_SRC emacs-lisp
  527. (delete-selection-mode t)
  528. #+END_SRC
  529. Remember the current location in a file
  530. #+BEGIN_SRC emacs-lisp
  531. (use-package saveplace
  532. :unless noninteractive
  533. :config
  534. (save-place-mode))
  535. #+END_SRC
  536. * Org Mode
  537. ** Installation
  538. Although org mode ships with Emacs, the latest version can be installed externally. The configuration here follows the [[http://orgmode.org/elpa.html][Org mode ELPA Installation instructions.]]
  539. Added a hook to complete org functions, company-capf is necessary for this
  540. #+BEGIN_SRC emacs-lisp
  541. (use-package org
  542. :ensure org-plus-contrib
  543. :init
  544. (add-hook 'org-mode-hook 'company/org-mode-hook)
  545. )
  546. #+END_SRC
  547. To avoid problems executing source blocks out of the box. [[https://emacs.stackexchange.com/a/28604][Others have the same problem, too]]. The solution is to remove the .elc files form the package directory:
  548. #+BEGIN_SRC shell
  549. var ORG_DIR=(let* ((org-v (cadr (split-string (org-version nil t) "@"))) (len (length org-v))) (substring org-v 1 (- len 2)))
  550. rm ${ORG_DIR}/*.elc
  551. #+END_SRC
  552. ** Setup
  553. *** Paths
  554. Paths need to be different for work and home
  555. #+BEGIN_SRC emacs-lisp
  556. (if (string-equal my/whoami "work_remote")
  557. (progn
  558. (defvar PATH_ORG_FILES "p:/Eigene Dateien/Notizen/")
  559. (defvar PATH_ORG_JOURNAL "p:/Eigene Dateien/Notizen/Journal/")
  560. (defvar PATH_START "p:/Eigene Dateien/Notizen/"))
  561. )
  562. (if (string-equal my/whoami "home")
  563. (progn
  564. (setq org-default-notes-file "~/Archiv/Dokumente/Notizen/notes.org")
  565. (setq org-agenda-files
  566. (delq nil
  567. (mapcar (lambda (x) (and (file-exists-p x) x))
  568. '("~/Archiv/Dokumente/Agenda")))))
  569. (if (string-equal my/whoami "work_remote")
  570. (progn
  571. (setq org-default-notes-file (concat PATH_ORG_FILES "notes.org"))
  572. (setq org-agenda-files (list(concat PATH_ORG_FILES "notes.org")
  573. (concat PATH_ORG_FILES "projects.org")
  574. (concat PATH_ORG_FILES "todo.org"))))))
  575. (setq org-id-locations-file (concat PATH_USER_LOCAL ".org-id-locations"))
  576. #+END_SRC
  577. *** Settings
  578. Speed commands are a nice and quick way to perform certain actions while at the beginning of a heading. It's not activated by default.
  579. See the doc for speed keys by checking out the documentation for speed keys in Org mode.
  580. #+BEGIN_SRC emacs-lisp
  581. (setq org-use-speed-commands t)
  582. (setq org-image-actual-width 550)
  583. (setq org-highlight-latex-and-related '(latex script entities))
  584. #+END_SRC
  585. Hide emphasis markup (e.g. / ... / for italics, etc.)
  586. #+BEGIN_SRC emacs-lisp
  587. (setq org-hide-emphasis-markers t)
  588. #+END_SRC
  589. The default value for the org tag column is -77, which is weird for smaller width windows. I'd rather have the tags align horizontally with the header.
  590. 45 is a good column number to do that.
  591. #+BEGIN_SRC emacs-lisp
  592. (setq org-tags-column 45)
  593. #+END_SRC
  594. *** Org key bindings
  595. Set up some global key bindings that integrate with Org mode features
  596. #+BEGIN_SRC emacs-lisp
  597. (bind-key "C-c l" 'org-store-link)
  598. (bind-key "C-c c" 'org-capture)
  599. (bind-key "C-c a" 'org-agenda)
  600. #+END_SRC
  601. Org overwrites RET and C-j, so I need to disable the rebinds
  602. #+BEGIN_SRC emacs-lisp
  603. (define-key org-mode-map (kbd "RET") nil) ;;org-return
  604. (define-key org-mode-map (kbd "C-j") nil) ;;org-return-indent
  605. #+END_SRC
  606. *** Org agenda
  607. For a more detailed example [[https://github.com/sachac/.emacs.d/blob/83d21e473368adb1f63e582a6595450fcd0e787c/Sacha.org#org-agenda][see here]].
  608. Custom todo-keywords, depending on environment
  609. #+BEGIN_SRC emacs-lisp
  610. (pcase my/whoami
  611. ("work_remote")
  612. (setq org-todo-keywords
  613. '((sequence "OPEN" "TODO" "UNCLEAR" "|" "DONE" "IMPOSSIBLE")))
  614. )
  615. #+END_SRC
  616. Sort org agenda by deadline and priority
  617. #+BEGIN_SRC emacs-lisp
  618. (setq org-agenda-sorting-strategy
  619. (quote
  620. ((agenda deadline-up priority-down)
  621. (todo priority-down category-keep)
  622. (tags priority-down category-keep)
  623. (search category-keep)))
  624. )
  625. #+END_SRC
  626. Customize the org agenda
  627. #+BEGIN_SRC emacs-lisp
  628. (defun my-org-skip-subtree-if-priority (priority)
  629. "Skip an agenda subtree if it has a priority of PRIORITY.
  630. PRIORITY may be one of the characters ?A, ?B, or ?C."
  631. (let ((subtree-end (save-excursion (org-end-of-subtree t)))
  632. (pri-value (* 1000 (- org-lowest-priority priority)))
  633. (pri-current (org-get-priority (thing-at-point 'line t))))
  634. (if (= pri-value pri-current)
  635. subtree-end
  636. nil)))
  637. (setq org-agenda-custom-commands
  638. '(("c" "Simple agenda view"
  639. ((tags "PRIORITY=\"A\""
  640. ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done))
  641. (org-agenda-overriding-header "Hohe Priorität:")))
  642. (agenda ""
  643. ((org-agenda-span 7)
  644. (org-agenda-start-on-weekday nil)
  645. (org-agenda-overriding-header "Nächsten 7 Tage:")))
  646. (alltodo ""
  647. ((org-agenda-skip-function '(or (my-org-skip-subtree-if-priority ?A)
  648. (org-agenda-skip-if nil '(scheduled deadline))))
  649. (org-agenda-overriding-header "Sonstige Aufgaben:"))))))
  650. )
  651. #+END_SRC
  652. *** Org capture
  653. Work specific org-capture-templates
  654. #+BEGIN_SRC emacs-lisp
  655. (pcase my/whoami
  656. ("work_remote"
  657. (setq org-capture-templates
  658. '(("t" "todo" entry (file (concat PATH_ORG_FILES "todo.org"))
  659. "** TODO %\\n%u\n%a\n")
  660. ("n" "note" entry (file org-default-notes-file))
  661. ("p" "project" entry (file (concat PATH_ORG_FILES "projects.org"))
  662. "** OPEN %?\n%u\n** Beschreibung\n** Zu erledigen\n*** \n** Verlauf\n***" :clock-in t :clock-resume t)
  663. ("u" "Unterbrechung" entry (file org-default-notes-file)
  664. "* Unterbrechnung durch %? :Unterbrechung:\n%t" :clock-in t :clock-resume t))))
  665. )
  666. #+END_SRC
  667. ** Org babel languages
  668. This code block is linux specific. Loading languages which aren't available seems to be a problem
  669. #+BEGIN_SRC emacs-lisp
  670. (cond ((eq system-type 'gnu/linux)
  671. (org-babel-do-load-languages
  672. 'org-babel-load-languages
  673. '(
  674. (C . t)
  675. (calc . t)
  676. (java . t)
  677. (ipython . t)
  678. (js . t)
  679. (latex . t)
  680. (ledger . t)
  681. (beancount . t)
  682. (lisp . t)
  683. (python . t)
  684. (R . t)
  685. (ruby . t)
  686. (scheme . t)
  687. (shell . t)
  688. (sqlite . t)
  689. )
  690. ))
  691. )
  692. #+END_SRC
  693. #+BEGIN_SRC emacs-lisp
  694. (defun my-org-confirm-babel-evaluate (lang body)
  695. "Do not confirm evaluation for these languages."
  696. (not (or (string= lang "beancount")
  697. (string= lang "C")
  698. (string= lang "emacs-lisp")
  699. (string= lang "ipython")
  700. (string= lang "java")
  701. (string= lang "ledger")
  702. (string= lang "python")
  703. (string= lang "R")
  704. (string= lang "sqlite"))))
  705. (setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate)
  706. #+END_SRC
  707. I want plots!
  708. #+BEGIN_SRC emacs-lisp
  709. (use-package ess
  710. :ensure t
  711. )
  712. (add-hook 'org-babel-after-execute-hook 'org-display-inline-images)
  713. (add-hook 'org-mode-hook 'org-display-inline-images)
  714. #+END_SRC
  715. ** Org babel/source blocks
  716. I like to have source blocks properly syntax highlighted and with the editing popup window staying within the same window so all the windows don't jump around. Also, having the top and bottom trailing lines in the block is a waste of space, so we can remove them
  717. I noticed that fontification doesn't work with markdown mode when the block is indented after editing it in the org src buffer - the leading #s for headers don't get fontified properly because they apppear as Org comments. Setting ~org-src-preserve-identation~ makes things consistent as it doesn't pad source blocks with leading spaces
  718. #+BEGIN_SRC emacs-lisp
  719. (setq org-src-fontify-natively t
  720. org-src-window-setup 'current-window
  721. org-src-strip-leading-and-trailing-blank-lines t
  722. org-src-preserve-indentation nil ; these two lines respect the indentation of
  723. org-edit-src-content-indentation 0 ; the surrounding text around the source block
  724. org-src-tab-acts-natively t)
  725. #+END_SRC
  726. * Pandoc
  727. Convert between formats, like from org to html.
  728. Pandoc needs to be installed on the system
  729. #+BEGIN_SRC shell
  730. sudo apt install pandoc
  731. #+END_SRC
  732. Pandoc-mode is a minor mode to interact with pandoc
  733. #+BEGIN_SRC emacs-lisp
  734. (use-package pandoc-mode
  735. :ensure t
  736. :init
  737. (add-hook 'markdown-mode-hook 'pandoc-mode))
  738. #+END_SRC
  739. * Emails
  740. Currently following tools are required:
  741. - notmuch (edit, read, tag, delete emails)
  742. - isync /mbsync (fetch or sync emails)
  743. After setting up mbsync, notmuch must be configured. Execute "notmuch" from the command line to launch the setup wizard. After it, "notmuch new" to create a new database, which will index the available local e-mails.
  744. TODO:
  745. - setup of mbsync on linux
  746. - setup of notmuch on linux
  747. - shell script for installation of isync and notmuch
  748. - more config for notmuch?
  749. - hydra for notmuch?
  750. - maybe org-notmuch?
  751. - some way to refresh the notmuch db before I run notmuch?
  752. #+BEGIN_SRC emacs-lisp
  753. (unless (string-equal my/whoami "work_remote")
  754. (use-package notmuch
  755. :defer t
  756. :ensure t
  757. )
  758. )
  759. #+END_SRC
  760. * Personal Finances
  761. After trying ledger, I chose beancount. It is closer to real bookkeeping and has stricter rules.
  762. Since there is no debian package, it is an option to install it via pip.
  763. I picked /opt for the installation path
  764. #+BEGIN_SRC shell
  765. sudo su
  766. cd /opt
  767. python3 -m venv beancount
  768. source ./beancount/bin/activate
  769. pip3 install wheel
  770. pip3 install beancount
  771. deactivate
  772. #+END_SRC
  773. When using beancount, it will automatically pick the created virtual environment.
  774. Activate the beancount mode. ATTENTION: This mode is made by myself.
  775. #+BEGIN_SRC emacs-lisp
  776. (unless (string-equal my/whoami "work_remote")
  777. (load "/home/marc/.emacs.d/user-local/elisp/beancount-mode.el") ; somehow load-path in use-package doesn't work
  778. (use-package beancount
  779. :load-path "/home/marc/.emacs.d/elisp"
  780. :defer t
  781. :mode ("\\.beancount$" . beancount-mode)
  782. :init
  783. (add-hook 'beancount-mode-hook 'company/beancount-mode-hook)
  784. (setenv "PATH"
  785. (concat
  786. "/opt/beancount/bin:"
  787. (getenv "PATH"))
  788. )
  789. :config
  790. (setq beancount-filename-main "/home/marc/Archiv/Finanzen/transactions.beancount")
  791. )
  792. )
  793. #+END_SRC
  794. Installing fava for reports is strongly recommended.
  795. #+BEGIN_SRC shell
  796. sudo su
  797. cd /opt
  798. python3 -m venv vava
  799. source ./vava/bin/activate
  800. pip3 install wheel
  801. pip3 install fava
  802. deactivate
  803. #+END_SRC
  804. Start fava with
  805. #+BEGIN_SRC shell
  806. fava my_file.beancount
  807. #+END_SRC
  808. It is accessable on this URL: [[http://127.0.0.1:5000][Fava]]
  809. Beancount-mode can start fava and open the URL right away.
  810. * Programming
  811. ** Common things
  812. List of plugins and settings which are shared between the language plugins
  813. Highlight whitespaces, tabs, empty lines.
  814. #+BEGIN_SRC emacs-lisp
  815. (use-package whitespace
  816. :demand t
  817. :ensure nil
  818. :diminish whitespace-mode;;mode shall be active, but not shown in mode line
  819. :init
  820. (dolist (hook '(prog-mode-hook
  821. text-mode-hook
  822. conf-mode-hook))
  823. (add-hook hook #'whitespace-mode))
  824. ;; :hook ;;not working in use-package 2.3
  825. ;; ((prog-mode . whitespace-turn-on)
  826. ;; (text-mode . whitespace-turn-on))
  827. :config
  828. (setq-default whitespace-style '(face empty tab trailing))
  829. )
  830. #+END_SRC
  831. Disable Eldoc, it interferes with flycheck
  832. #+BEGIN_SRC emacs-lisp
  833. (use-package eldoc
  834. :ensure nil
  835. :config
  836. (global-eldoc-mode -1)
  837. )
  838. #+END_SRC
  839. Colorize colors as text with their value
  840. #+BEGIN_SRC emacs-lisp
  841. (use-package rainbow-mode
  842. :ensure t
  843. :init
  844. (add-hook 'prog-mode-hook 'rainbow-mode t)
  845. :diminish rainbow-mode
  846. ;; :hook prog-mode ;; not working in use-package 2.3
  847. :config
  848. (setq-default rainbow-x-colors-major-mode-list '())
  849. )
  850. #+END_SRC
  851. Highlight parens etc. for improved readability
  852. #+BEGIN_SRC emacs-lisp
  853. (use-package rainbow-delimiters
  854. :ensure t
  855. :config
  856. (add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
  857. )
  858. #+END_SRC
  859. Treat CamelCase combined words as individual words
  860. #+BEGIN_SRC emacs-lisp
  861. (use-package subword
  862. :diminish subword-mode
  863. :config
  864. (add-hook 'python-mode-hook 'subword-mode))
  865. #+END_SRC
  866. ** Smartparens
  867. Smartparens is a beast on its own, so it's worth having a dedicated section for it
  868. #+BEGIN_SRC emacs-lisp
  869. (use-package smartparens
  870. :ensure t
  871. :diminish smartparens-mode
  872. :config
  873. (add-hook 'prog-mode-hook 'smartparens-mode)
  874. )
  875. #+END_SRC
  876. ** Git
  877. *** Magit
  878. [[https://magit.vc/manual/magit/index.html][Link]]
  879. I want to do git stuff here, not in a separate terminal window
  880. Little crashcourse in magit:
  881. - magit-init to init a git project
  882. - magit-status (C-x g) to call the status window
  883. in status buffer:
  884. - s stage files
  885. - u unstage files
  886. - U unstage all files
  887. - a apply changed to staging
  888. - c c commit (type commit message, then C-c C-c to commit)
  889. - b b switch to another branch
  890. - P u git push
  891. - F u git pull
  892. #+BEGIN_SRC emacs-lisp
  893. (use-package magit
  894. :ensure t
  895. :defer t
  896. :init
  897. ;; set git-path in work environment
  898. (if (string-equal user-login-name "POH")
  899. (setq magit-git-executable "P:/Eigene Dateien/Tools/Git/bin/git.exe")
  900. )
  901. :defer t
  902. :bind (("C-x g" . magit-status))
  903. )
  904. #+END_SRC
  905. *** Git-gutter
  906. Display line changes in gutter based on git history. Enable it everywhere
  907. [[https://github.com/syohex/emacs-git-gutter][Source]]
  908. #+BEGIN_SRC emacs-lisp
  909. (use-package git-gutter
  910. :ensure t
  911. :defer t
  912. :config
  913. (global-git-gutter-mode t)
  914. :diminish git-gutter-mode
  915. )
  916. #+END_SRC
  917. Some persistent navigation in git-gutter is nice, so here's a hydra for it:
  918. #+BEGIN_SRC emacs-lisp
  919. (defhydra hydra-git-gutter (:body-pre (git-gutter-mode 1)
  920. :hint nil)
  921. "
  922. ^Git Gutter^ ^Git^ ^misc^
  923. ^──────────^────────^───^────────────────^────^──────────────────────────
  924. _j_: next hunk _s_tage hunk _q_uit
  925. _k_: previous hunk _r_evert hunk _g_ : call magit-status
  926. _h_: first hunk _p_opup hunk
  927. _l_: last hunk set start _R_evision
  928. ^^ ^^ ^^
  929. "
  930. ("j" git-gutter:next-hunk)
  931. ("k" git-gutter:previous-hunk)
  932. ("h" (progn (goto-char (point-min))
  933. (git-gutter:next-hunk 1)))
  934. ("l" (progn (goto-char (point-min))
  935. (git-gutter:previous-hunk 1)))
  936. ("s" git-gutter:stage-hunk)
  937. ("r" git-gutter:revert-hunk)
  938. ("p" git-gutter:popup-hunk)
  939. ("R" git-gutter:set-start-revision)
  940. ("q" nil :color blue)
  941. ("g" magit-status)
  942. )
  943. #+END_SRC
  944. *** Git-timemachine
  945. Time machine lets me step through the history of a file as recorded in git.
  946. [[https://github.com/pidu/git-timemachine][Source]]
  947. #+BEGIN_SRC emacs-lisp
  948. (use-package git-timemachine
  949. :ensure t
  950. :defer t
  951. )
  952. #+END_SRC
  953. ** Company Mode
  954. Complete Anything!
  955. Activate company and make it react nearly instantly
  956. #+BEGIN_SRC emacs-lisp
  957. (use-package company
  958. :ensure t
  959. :config
  960. (setq-default company-minimum-prefix-length 1
  961. company-tooltip-align-annotation t
  962. company-tooltop-flip-when-above t
  963. company-show-numbers t
  964. company-idle-delay 0.1)
  965. ;; (define-key company-active-map (kbd "TAB") #'company-complete-selection)
  966. ;; (define-key company-active-map (kbd "RET") nil)
  967. (company-tng-configure-default)
  968. )
  969. #+END_SRC
  970. For a nicer suggestion box: company-box ([[https://github.com/sebastiencs/company-box][Source]])
  971. It is only available for emacs 26 and higher.
  972. #+BEGIN_SRC emacs-lisp
  973. (when (> emacs-major-version 25)
  974. (use-package company-box
  975. :ensure t
  976. :init
  977. (add-hook 'company-mode-hook 'company-box-mode)))
  978. #+END_SRC
  979. *** Company backend hooks
  980. Backend configuration for python-mode
  981. Common backends are:
  982. - company-files: files & directory
  983. - company-keywords: keywords
  984. - company-capf: ??
  985. - company-abbrev: ??
  986. - company-dabbrev: dynamic abbreviations
  987. - company-ispell: ??
  988. #+BEGIN_SRC emacs-lisp
  989. (defun company/python-mode-hook()
  990. (message "python-mode-hook activated")
  991. (set (make-local-variable 'company-backends)
  992. '((company-jedi)))
  993. ; '((company-jedi company-dabbrev-code company-yasnippet) company-capf company-files))
  994. ; '((company-lsp company-yasnippet) company-capf company-dabbrev company-files))
  995. (company-mode t)
  996. )
  997. #+END_SRC
  998. (defun add-pcomplete-to-capf ()
  999. (add-hook 'completion-at-point-functions 'pcomplete-completions-at-point nil t))
  1000. ;; (add-hook 'completion-at-point-functions 'pcomplete-completions-at-point nil t)
  1001. (add-hook 'org-mode-hook #'add-pcomplete-to-capf)
  1002. Backend for Orgmode
  1003. #+BEGIN_SRC emacs-lisp
  1004. (defun company/org-mode-hook()
  1005. (set (make-local-variable 'company-backends)
  1006. '(company-capf company-files))
  1007. (add-hook 'completion-at-point-functions 'pcomplete-completions-at-point nil t)
  1008. (company-mode t)
  1009. )
  1010. #+END_SRC
  1011. Backend configuration for lisp-mode
  1012. #+BEGIN_SRC emacs-lisp
  1013. (defun company/elisp-mode-hook()
  1014. (set (make-local-variable 'company-backends)
  1015. '((company-elisp company-dabbrev) company-capf company-files))
  1016. (company-mode t)
  1017. )
  1018. #+END_SRC
  1019. Backend configuration for beancount
  1020. #+BEGIN_SRC emacs-lisp
  1021. (defun company/beancount-mode-hook()
  1022. (set (make-local-variable 'company-backends)
  1023. '(company-beancount))
  1024. ; '((company-beancount company-dabbrev) company-capf company-files))
  1025. (company-mode t)
  1026. )
  1027. #+END_SRC
  1028. *** Misc Company packages
  1029. Addon to sort suggestions by usage
  1030. #+BEGIN_SRC emacs-lisp
  1031. (use-package company-statistics
  1032. :ensure t
  1033. :after company
  1034. :init
  1035. (setq company-statistics-file (concat PATH_USER_LOCAL "company-statistics-cache.el"));~/.emacs.d/user-dir/company-statistics-cache.el")
  1036. :config
  1037. (company-statistics-mode 1)
  1038. )
  1039. #+END_SRC
  1040. Get a popup with documentation of the completion candidate.
  1041. For the popups the package pos-tip.el is used and automatically installed.
  1042. [[https://github.com/expez/company-quickhelp][Company Quickhelp]]
  1043. [[https://www.emacswiki.org/emacs/PosTip][See here for Pos-Tip details]]
  1044. #+BEGIN_SRC emacs-lisp
  1045. (use-package company-quickhelp
  1046. :ensure t
  1047. :after company
  1048. :config
  1049. (company-quickhelp-mode 1)
  1050. )
  1051. #+END_SRC
  1052. Maybe add [[https://github.com/hlissner/emacs-company-dict][company-dict]]? It's a dictionary based on major modes, plus it has Yasnippet integration.
  1053. ** Flycheck
  1054. Show errors right away!
  1055. #+BEGIN_SRC emacs-lisp
  1056. (use-package flycheck
  1057. :ensure t
  1058. :diminish flycheck-mode " ✓"
  1059. :init
  1060. (setq flycheck-emacs-lisp-load-path 'inherit)
  1061. (add-hook 'after-init-hook #'global-flycheck-mode)
  1062. ; (add-hook 'python-mode-hook (lambda ()
  1063. ; (semantic-mode 1)
  1064. ; (flycheck-select-checker 'python-pylint)))
  1065. )
  1066. #+END_SRC
  1067. ** Projectile
  1068. Brings search functions on project level
  1069. #+BEGIN_SRC emacs-lisp
  1070. (use-package projectile
  1071. :ensure t
  1072. :defer t
  1073. :bind
  1074. (("C-c p p" . projectile-switch-project)
  1075. ("C-c p s s" . projectile-ag))
  1076. :init
  1077. (setq-default
  1078. projectile-cache-file (concat PATH_USER_LOCAL ".projectile-cache")
  1079. projectile-known-projects-file (concat PATH_USER_LOCAL ".projectile-bookmarks"))
  1080. :config
  1081. (projectile-mode t)
  1082. (setq-default
  1083. projectile-completion-system 'ivy
  1084. projectile-enable-caching t
  1085. projectile-mode-line '(:eval (projectile-project-name)))
  1086. )
  1087. #+END_SRC
  1088. ** Yasnippet
  1089. Snippets!
  1090. TODO: yas-minor-mode? what's that?
  1091. #+BEGIN_SRC emacs-lisp
  1092. (use-package yasnippet
  1093. :ensure t
  1094. :defer t
  1095. :diminish yas-minor-mode
  1096. :init
  1097. (setq yas-snippet-dirs (concat PATH_USER_GLOBAL "snippets"))
  1098. (yas-global-mode t)
  1099. :mode ("\\.yasnippet" . snippet-mode)
  1100. ; :config
  1101. ; (yas-reload-all) ;; ensure snippets are updated and available, necessary when not using global-mode
  1102. )
  1103. #+END_SRC
  1104. ** Lisp
  1105. #+BEGIN_SRC emacs-lisp
  1106. (add-hook 'emacs-lisp-mode-hook 'company/elisp-mode-hook)
  1107. #+END_SRC
  1108. Add some helpers to handle and understand macros
  1109. #+BEGIN_SRC emacs-lisp
  1110. (use-package macrostep
  1111. :ensure t
  1112. :defer t
  1113. :init
  1114. (define-key emacs-lisp-mode-map (kbd "C-c e") 'macrostep-expand)
  1115. (define-key emacs-lisp-mode-map (kbd "C-c c") 'macrostep-collapse))
  1116. #+END_SRC
  1117. ** Python
  1118. *** Intro
  1119. Systemwide following packages need to be installed:
  1120. - venv
  1121. The virtual environments need to have following modules installed:
  1122. - wheel (for some reason it isn't pulled by other packages, yet they complain about missing wheel)
  1123. - jedi
  1124. - epc
  1125. - pylint
  1126. *** Python-Mode
  1127. Automatically start python-mode when opening a .py-file.
  1128. Not sure if python.el is better than python-mode.el.
  1129. See [[https://github.com/jorgenschaefer/elpy/issues/887][here]] for info about ~python-shell-completion-native-enable~.
  1130. The custom function is to run inferiour processes (do I really need that?), see [[https://emacs.stackexchange.com/questions/16361/how-to-automatically-run-inferior-process-when-loading-major-mode][here]].
  1131. Also limit the completion backends to those which make sense in Python.
  1132. #+BEGIN_SRC emacs-lisp
  1133. (use-package python
  1134. :mode ("\\.py\\'" . python-mode)
  1135. :interpreter ("python" . python-mode)
  1136. :defer t
  1137. :init
  1138. (add-hook 'python-mode-hook (lambda ()
  1139. 'company/python-mode-hook
  1140. (semantic-mode t)
  1141. (flycheck-select-checker 'python-pylint)))
  1142. :config
  1143. (setq python-shell-completion-native-enable nil)
  1144. )
  1145. #+END_SRC
  1146. *** Python language server (inactive)
  1147. First test for lsp-python.
  1148. Source python language server: [[https://github.com/palantir/python-language-server][Link]]
  1149. Source lsp-mode:
  1150. Source lsp-python: [[https://github.com/emacs-lsp/lsp-python][Link]]
  1151. Source company-lsp: [[https://github.com/tigersoldier/company-lsp][Link]]
  1152. Source lsp-ui: [[https://github.com/emacs-lsp/lsp-ui][Link]]
  1153. BEGIN_SRC emacs-lisp
  1154. (use-package lsp-mode
  1155. :ensure t
  1156. :defer t)
  1157. (add-hook 'lsp-mode-hook #'(lambda ()
  1158. (customize-set-variable 'lsp-enable-eldoc nil)
  1159. (flycheck-mode 1)
  1160. (company-mode 1)))
  1161. (use-package lsp-ui
  1162. :ensure t
  1163. :defer t)
  1164. (use-package company-lsp
  1165. :ensure t
  1166. :defer t)
  1167. (use-package lsp-python
  1168. :ensure t
  1169. :after lsp-mode
  1170. :defer t
  1171. :init
  1172. (add-hook 'python-mode-hook #'(lambda ()
  1173. (lsp-python-enable)
  1174. (flycheck-select-checker 'python-flake8))))
  1175. END_SRC
  1176. *** Jedi / Company
  1177. Jedi is a backend for python autocompletion and needs to be installed on the server:
  1178. - pip install jedi
  1179. Code checks need to be installed, too:
  1180. - pip install flake8
  1181. #+BEGIN_SRC emacs-lisp
  1182. (use-package company-jedi
  1183. :defer t
  1184. ;; :after company
  1185. :ensure t
  1186. :config
  1187. (setq jedi:environment-virtualenv (list (expand-file-name "~/Archiv/Programmierprojekte/Python/virtualenv/")))
  1188. (setq jedi:python-environment-directory (list (expand-file-name "~/Archiv/Programmierprojekte/Python/virtualenv/")))
  1189. (add-hook 'python-mode-hook 'jedi:setup)
  1190. (setq jedi:complete-on-dot t)
  1191. (setq jedi:use-shortcuts t)
  1192. ;; (add-hook 'python-mode-hook 'company/python-mode-hook)
  1193. )
  1194. #+END_SRC
  1195. *** Virtual Environments
  1196. A wrapper to handle virtual environments.
  1197. I strongly recommend to install virtual environments on the terminal, not through this wrapper, but changing venvs is fine.
  1198. TODO: automatically start an inferior python process or switch to it if already created
  1199. #+BEGIN_SRC emacs-lisp
  1200. (use-package pyvenv
  1201. :ensure t
  1202. :defer t
  1203. :init
  1204. (setenv "WORKON_HOME" (expand-file-name "~/Archiv/Programmierprojekte/Python/virtualenv/"))
  1205. :config
  1206. (pyvenv-mode t)
  1207. (defun my/post-activate-hook()
  1208. (setq jedi:environment-root pyvenv-virtual-env)
  1209. (setq jedi:environment-virtualenv pyvenv-virtual-env)
  1210. (setq jedi:tooltip-method '(nil)) ;; variants: nil or pos-tip and/or popup
  1211. (setq python-shell-virtualenv-root pyvenv-virtual-env)
  1212. ;; default traceback, other option M-x jedi:toggle-log-traceback
  1213. ;; traceback is in jedi:pop-to-epc-buffer
  1214. (jedi:setup)
  1215. (company/python-mode-hook)
  1216. (setq jedi:server-args '("--log-traceback")))
  1217. (add-hook 'pyvenv-post-activate-hooks 'my/post-activate-hook)
  1218. )
  1219. #+END_SRC
  1220. I want Emacs to automatically start the proper virtual environment.
  1221. Required is a .python-version file with, content in the first line being /path/to/virtualenv/
  1222. [[https://github.com/marcwebbie/auto-virtualenv][Github source]]
  1223. Depends on pyvenv
  1224. #+BEGIN_SRC emacs-lisp
  1225. (use-package auto-virtualenv
  1226. :ensure t
  1227. ;; :after pyvenv
  1228. :defer t
  1229. :init
  1230. (add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv)
  1231. ;; activate on changing buffers
  1232. ;; (add-hook 'window-configuration-change-hook 'auto-virtualenv-set-virtualenv)
  1233. ;; activate on focus in
  1234. ;; (add-hook 'focus-in-hook 'auto-virtualenv-set-virtualenv)
  1235. )
  1236. #+END_SRC
  1237. *** Visuals
  1238. Highlight indentations
  1239. #+BEGIN_SRC emacs-lisp
  1240. (use-package highlight-indentation
  1241. :init
  1242. (add-hook 'python-mode-hook 'highlight-indentation-current-column-mode)
  1243. (add-hook 'python-mode-hook 'highlight-indentation-mode)
  1244. :config
  1245. (set-face-background 'highlight-indentation-face "#454545")
  1246. (set-face-background 'highlight-indentation-current-column-face "#656565"))
  1247. #+END_SRC
  1248. BEGIN_SRC emacs-lisp
  1249. (use-package highlight-indent-guides
  1250. :ensure t
  1251. :defer t
  1252. :init
  1253. (add-hook 'python-mode-hook 'highlight-indent-guides-mode)
  1254. :config
  1255. (setq highlight-indent-guides-method 'column ;'character
  1256. ;highlight-indent-guides-character ?\|
  1257. highlight-indent-guides-auto-odd-face-perc 15
  1258. highlight-indent-guides-auto-even-face-perc 15
  1259. highlight-indent-guides-auto-character-face-perc 20))
  1260. END_SRC
  1261. *** Anaconda (inactive)
  1262. Anaconda test
  1263. #+BEGIN_SRC emacs-lisp
  1264. ; (use-package anaconda-mode
  1265. ; :ensure t
  1266. ; :defer t
  1267. ; :init
  1268. ; (add-hook 'python-mode-hook 'anaconda-mode)
  1269. ;; (add-hook 'python-mode-hook 'anaconda-eldoc-mode)
  1270. ; :config
  1271. ; (setq anaconda-eldoc-mode 1)
  1272. ; )
  1273. #+END_SRC
  1274. #+BEGIN_SRC emacs-lisp
  1275. ; (use-package company-anaconda
  1276. ; :ensure t
  1277. ; :defer t
  1278. ; :init
  1279. ; (defun my/company-anaconda-hook()
  1280. ; (add-to-list 'company-backends 'company-anaconda))
  1281. ; (add-hook 'python-mode-hook 'my/company-anaconda-hook)
  1282. ; )
  1283. #+END_SRC
  1284. ** Latex
  1285. Requirements for Linux:
  1286. - Latex
  1287. - pdf-tools
  1288. The midnight mode hook is disabled for now, because CVs with my pic just look weird in this mode.
  1289. #+BEGIN_SRC emacs-lisp
  1290. (unless (string-equal my/whoami "work_remote")
  1291. (use-package pdf-tools
  1292. :ensure t
  1293. :defer t
  1294. :mode (("\\.pdf\\'" . pdf-view-mode))
  1295. :init
  1296. ; (add-hook 'pdf-view-mode-hook 'pdf-view-midnight-minor-mode)
  1297. :config
  1298. (pdf-tools-install)
  1299. (setq pdf-view-resize-factor 1.1 ;; more finegraned zoom
  1300. pdf-view-midnight-colors '("#c6c6c6" . "#363636")
  1301. TeX-view-program-selection '((output-pdf "pdf-tools"))
  1302. TeX-view-program-list '(("pdf-tools" "Tex-pdf-tools-sync-view")))
  1303. )
  1304. )
  1305. #+END_SRC
  1306. For latex-preview-pane a patch might be necessary (as of 2017-10), see the issue [[https://github.com/jsinglet/latex-preview-pane/issues/37][here]]
  1307. Update 2018-03: It seems to work without this patch. I will keep it here in case something breaks again.
  1308. #+BEGIN_SRC
  1309. latex-preview-pane-update-p()
  1310. --- (doc-view-revert-buffer nil t)
  1311. +++ (revert-buffer-nil t 'preserve-modes)
  1312. #+END_SRC
  1313. After that M-x byte-compile-file
  1314. #+BEGIN_SRC emacs-lisp
  1315. (use-package latex-preview-pane
  1316. :ensure t
  1317. :defer t
  1318. :init
  1319. ;; one of these works
  1320. (add-hook 'LaTeX-mode-hook 'latex-preview-pane-mode)
  1321. (add-hook 'latex-mode-hook 'latex-preview-pane-mode)
  1322. (setq auto-mode-alist
  1323. (append '(("\\.tex$" . latex-mode)) auto-mode-alist))
  1324. )
  1325. ;; necessary, because linum-mode isn't compatible and prints errors
  1326. (add-hook 'pdf-view-mode-hook (lambda () (linum-mode -1)))
  1327. #+END_SRC
  1328. ** Markdown
  1329. Major mode to edit markdown files.
  1330. For previews it needs markdown installed on the system.
  1331. For debian:
  1332. #+BEGIN_SRC shell
  1333. sudo apt install markdown
  1334. #+END_SRC
  1335. #+BEGIN_SRC emacs-lisp
  1336. (use-package markdown-mode
  1337. :ensure t
  1338. :defer t)
  1339. #+END_SRC
  1340. ** Hydra Flycheck
  1341. Flycheck is necessary, obviously
  1342. #+BEGIN_SRC emacs-lisp
  1343. (defhydra hydra-flycheck (:color blue)
  1344. "
  1345. ^
  1346. ^Flycheck^ ^Errors^ ^Checker^
  1347. ^────────^──────────^──────^────────────^───────^───────────
  1348. _q_ quit _<_ previous _?_ describe
  1349. _m_ manual _>_ next _d_ disable
  1350. _v_ verify setup _f_ check _s_ select
  1351. ^^ ^^ ^^
  1352. "
  1353. ("q" nil)
  1354. ("<" flycheck-previous-error :color red)
  1355. (">" flycheck-next-error :color red)
  1356. ("?" flycheck-describe-checker)
  1357. ("d" flycheck-disable-checker)
  1358. ("f" flycheck-buffer)
  1359. ("m" flycheck-manual)
  1360. ("s" flycheck-select-checker)
  1361. ("v" flycheck-verify-setup)
  1362. )
  1363. #+END_SRC
  1364. * Orchestrate the configuration
  1365. Some settings should be set for all systems, some need to be specific (like my job-emacs doesn't need development tools).
  1366. ** Common
  1367. ** Home
  1368. ** Work
  1369. I mainly only use org
  1370. ** Work, Hyper-V
  1371. For testing purproses I keep a working emacs in a debian on hyper-v. The demands here are different to the other work-emacs
  1372. * Finishing
  1373. Stuff which I want to run in the end
  1374. #+BEGIN_SRC emacs-lisp
  1375. (message (emacs-init-time))
  1376. #+END_SRC