mirror of https://github.com/Chizi123/.emacs.d.git

Chizi123
2019-01-06 d070a7b257cf0c42efe058bc520a585fb166f46d
commit | author | age
d070a7 1 #+TITLE: My Emacs configuration
C 2 * Windows dependencies
3 Dependencies needed for Aspell, poppler PDF-tools, compilers and ghost-script provided by mingw64
4 #+BEGIN_SRC emacs-lisp
5   (when (eq system-type 'windows-nt)
6     (add-to-list 'exec-path "C:/msys64/usr/bin")
7     (add-to-list 'exec-path "C:/msys64/mingw64/bin")
8     (add-to-list 'exec-path "c:/Program Files/Racket")
9     (setenv "PATH" (mapconcat #'identity exec-path path-separator)))
10 #+END_SRC
11
12 * Aesthetic changes
13 ** Zenburn theme
14 #+BEGIN_SRC emacs-lisp
15   (use-package zenburn-theme
16     :ensure t
17     :config
18     (load-theme 'zenburn t))
19 #+END_SRC
20 ** Default font
21 #+BEGIN_SRC emacs-lisp
22 (set-default-font "DejaVu Sans Mono-10")
23 #+END_SRC
24 * Writing requirements
25 ** Spellchecking
26 #+BEGIN_SRC emacs-lisp
27   (require 'ispell)
28   (setq-default ispell-program-name "aspell")
29   (add-hook 'latex-mode-hook 'flyspell-mode)
30   (add-hook 'latex-mode-hook 'flyspell-buffer)
31   (add-hook 'org-mode-hook 'flyspell-mode)
32   (add-hook 'org-mode-hook 'flyspell-buffer)
33 #+END_SRC
34
35 ** Switch-window
36 Helps to change windows easily when many are open at once
37 #+BEGIN_SRC emacs-lisp
38 (use-package switch-window
39   :ensure t
40   :config
41     (setq switch-window-input-style 'minibuffer)
42     (setq switch-window-increase 4)
43     (setq switch-window-threshold 2)
44     (setq switch-window-shortcut-style 'qwerty)
45     (setq switch-window-qwerty-shortcuts
46         '("a" "s" "d" "f" "j" "k" "l" "i" "o"))
47   :bind
48     ([remap other-window] . switch-window))
49 #+END_SRC
50 ** Go to new window when opened
51 #+BEGIN_SRC emacs-lisp
52   (defun split-and-follow-horizontally ()
53     (interactive)
54     (split-window-below)
55     (balance-windows)
56     (other-window 1))
57   (global-set-key (kbd "C-x 2") 'split-and-follow-horizontally)
58
59   (defun split-and-follow-vertically ()
60     (interactive)
61     (split-window-right)
62     (balance-windows)
63     (other-window 1))
64   (global-set-key (kbd "C-x 3") 'split-and-follow-vertically)
65 #+END_SRC
66 ** PDF-tools
67 #+BEGIN_SRC emacs-lisp
68 (use-package pdf-tools
69   :ensure t
70   :config
71   (pdf-tools-install))
72
73 #+END_SRC
74 * Helm and projectile
75 ** Helm core
76 #+BEGIN_SRC emacs-lisp
77 (use-package helm-config
78   :ensure helm
79   :bind (("M-x" . helm-M-x)
80      ("C-x C-f" . helm-find-files)
81      ("M-y" . helm-show-kill-ring)
82      ("C-x b" . helm-mini)
83      ("C-c h o" . helm-occur))
84   :config
85   (setq helm-M-x-fuzzy-match t)
86   (setq helm-buffers-fuzzy-matching t
87     helm-recentf-fuzzy-match    t)
88   (setq helm-split-window-in-side-p           t ; open helm buffer inside current window, not occupy whole other window
89     helm-move-to-line-cycle-in-source     t ; move to end or beginning of source when reaching top or bottom of source.
90     helm-ff-search-library-in-sexp        t ; search for library in `require' and `declare-function' sexp.
91     helm-scroll-amount                    8 ; scroll 8 lines other window using M-<next>/M-<prior>
92     helm-ff-file-name-history-use-recentf t
93     helm-echo-input-in-header-line t)
94   (defun spacemacs//helm-hide-minibuffer-maybe ()
95     "Hide minibuffer in Helm session if we use the header line as input field."
96     (when (with-helm-buffer helm-echo-input-in-header-line)
97       (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
98     (overlay-put ov 'window (selected-window))
99     (overlay-put ov 'face
100                      (let ((bg-color (face-background 'default nil)))
101                        `(:background ,bg-color :foreground ,bg-color)))
102     (setq-local cursor-type nil))))
103   (add-hook 'helm-minibuffer-set-up-hook
104             'spacemacs//helm-hide-minibuffer-maybe)
105   (helm-mode 1))
106 #+END_SRC
107 ** Projectile
108 *** Enable it
109  #+BEGIN_SRC emacs-lisp
110    (use-package projectile
111      :ensure t
112      :bind ("C-c p" . projectile-command-map)
113      :config
114      (projectile-global-mode)
115      (setq projectile-completion-system 'helm)
116      (setq projectile-indexing-method 'alien))
117  #+END_SRC
118 *** Let it compile things
119  #+BEGIN_SRC emacs-lisp
120    (global-set-key (kbd "<f5>") 'projectile-compile-project)
121  #+END_SRC
122 *** Enable communication with helm
123 #+BEGIN_SRC emacs-lisp
124 (use-package helm-projectile
125   :ensure t
126   :config
127   (helm-projectile-on))
128 #+END_SRC
129 * Small tweaks
130 ** Remove startup screen
131 #+BEGIN_SRC emacs-lisp
132 (setq inhibit-startup-message t)
133 #+END_SRC
134 ** Disable bell
135 Bloody bell dings every time you hit a key too much
136 #+BEGIN_SRC emacs-lisp
137 (setq ring-bell-function 'ignore)
138 #+END_SRC
139 ** Pretty symbols
140 Why not? They make it look nice
141 #+BEGIN_SRC emacs-lisp
142   (when window-system
143     (use-package pretty-mode
144       :ensure t
145       :diminish t
146       :config
147       (global-pretty-mode)))
148 #+END_SRC
149 ** find file other window
150 Lets it accept more than one file. Works recursively.
151 #+BEGIN_SRC emacs-lisp
152 (defadvice find-file-other-window (around find-files activate)
153   (if (listp filename)
154       (loop for f in filename do (find-file-other-window f wildcards))
155     ad-do-it))
156 #+END_SRC
157 ** Which key
158 Helps to explain keybindings if you get lost
159 #+BEGIN_SRC emacs-lisp
160   (use-package which-key
161     :ensure t
162     :diminish which-key-mode
163     :config
164     (which-key-mode))
165 #+END_SRC
166 ** Go to this file
167 #+BEGIN_SRC emacs-lisp
168 (defun config-visit ()
169   (interactive)
170   (find-file "~/.emacs.d/config.org"))
171 (global-set-key (kbd "C-c e d") 'config-visit)
172 #+END_SRC
173 ** Reload configuration
174 #+BEGIN_SRC emacs-lisp
175 (defun config-reload ()
176   "Reloads ~/.emacs.d/config.org at run time"
177   (interactive)
178   (org-babel-load-file (expand-file-name "~/.emacs.d/config.org")))
179 (global-set-key (kbd "C-c e r") 'config-reload)
180 #+END_SRC
181 ** Smartparens
182 Matches brackets automatically
183 #+BEGIN_SRC emacs-lisp
184 (use-package smartparens
185   :ensure t
186   :diminish smartparens-mode
187   :config
188   (progn
189     (require 'smartparens-config)
190     (smartparens-global-mode 1)))
191 #+END_SRC
192 ** Rainbow
193 Its a little gimmicky but its still cool
194 #+BEGIN_SRC emacs-lisp
195   (use-package rainbow-mode
196     :ensure t
197     :init
198     (add-hook 'prog-mode-hook 'rainbow-mode))
199 #+END_SRC
200 ** Rainbow delimiters
201 A bit more useful than above.
202 Colours the brackets so that they stand out more.
203 #+BEGIN_SRC emacs-lisp
204   (use-package rainbow-delimiters
205     :ensure t
206     :init
207       (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
208 #+END_SRC
209 ** clean-aindent-mode
210 Removes unnecessary white space
211 #+BEGIN_SRC emacs-lisp
212 (use-package clean-aindent-mode
213   :ensure t
214   :hook prog-mode)
215 #+END_SRC
216 Shows trailing white space
217 #+BEGIN_SRC emacs-lisp
218 (add-hook 'prog-mode-hook (lambda () (interactive) (setq show-trailing-whitespace 1)))
219 #+END_SRC
220 ** whitespace mode
221 Reveals whitespace characters
222 #+BEGIN_SRC emacs-lisp
223 (global-set-key (kbd "C-c w") 'whitespace-mode)
224 (add-hook 'diff-mode-hook (lambda ()
225                             (setq-local whitespace-style
226                                         '(face
227                                           tabs
228                                           tab-mark
229                                           spaces
230                                           space-mark
231                                           trailing
232                                           indentation::space
233                                           indentation::tab
234                                           newline
235                                           newline-mark))
236                             (whitespace-mode 1)))
237
238 #+END_SRC
239 ** eldoc
240 #+BEGIN_SRC emacs-lisp
241   (add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
242   (add-hook 'lisp-interaction-mode-hook 'eldoc-mode)
243   (add-hook 'ielm-mode-hook 'eldoc-mode)
244 #+END_SRC
245 ** key-freq
246 collects interesting statistics
247 #+BEGIN_SRC emacs-lisp
248 (use-package keyfreq
249   :ensure t
250   :config
251   (keyfreq-mode 1)
252   (keyfreq-autosave-mode 1))
253 #+END_SRC
254 ** undo-tree
255 A more advanced undo mechanism
256 #+BEGIN_SRC emacs-lisp
257 (use-package undo-tree
258   :ensure t
259   :config
260   (global-undo-tree-mode))
261 #+END_SRC
262 ** volatile highlights
263 Colour the material just copied
264 #+BEGIN_SRC emacs-lisp
265 (use-package volatile-highlights
266   :ensure t
267   :config
268   (volatile-highlights-mode t))
269 #+END_SRC
270 ** Workgroups
271 Open the pages when you quit
272 #+BEGIN_SRC emacs-lisp
273 (use-package workgroups2
274   :ensure t
275   :config
276   (workgroups-mode 1))
277 #+END_SRC
278 ** ibuffer
279 #+BEGIN_SRC emacs-lisp
280 (global-set-key (kbd "C-x C-b") 'ibuffer)
281 (setq ibuffer-use-other-window t)
282 #+END_SRC
283 ** hippie expand
284 #+BEGIN_SRC emacs-lisp
285 (global-set-key (kbd "M-/") 'hippie-expand) ;; replace dabbrev-expand
286 (setq
287  hippie-expand-try-functions-list
288  '(try-expand-dabbrev ;; Try to expand word "dynamically", searching the current buffer.
289    try-expand-dabbrev-all-buffers ;; Try to expand word "dynamically", searching all other buffers.
290    try-expand-dabbrev-from-kill ;; Try to expand word "dynamically", searching the kill ring.
291    try-complete-file-name-partially ;; Try to complete text as a file name, as many characters as unique.
292    try-complete-file-name ;; Try to complete text as a file name.
293    try-expand-all-abbrevs ;; Try to expand word before point according to all abbrev tables.
294    try-expand-list ;; Try to complete the current line to an entire line in the buffer.
295    try-expand-line ;; Try to complete the current line to an entire line in the buffer.
296    try-complete-lisp-symbol-partially ;; Try to complete as an Emacs Lisp symbol, as many characters as unique.
297    try-complete-lisp-symbol) ;; Try to complete word as an Emacs Lisp symbol.
298  )
299 #+END_SRC
300 ** Highlight line
301 #+BEGIN_SRC emacs-lisp
302 (global-hl-line-mode)
303 #+END_SRC
304 ** Line numbers
305 #+BEGIN_SRC emacs-lisp
306 (add-hook 'prog-mode-hook 'linum-mode)
307 #+END_SRC
308
309 ** Garbage collection
310 starts garbage collection every 100MB
311 #+BEGIN_SRC emacs-lisp
312 (setq gc-cons-threshold 100000000)
313 #+END_SRC
314
315 ** Kill ring
316 Changes the kill ring size to 5000.
317 #+BEGIN_SRC emacs-lisp
318   (setq global-mark-ring-max 5000
319     mark-ring-max 5000
320     mode-require-final-newline t
321     kill-ring-max 5000
322     kill-whole-line t)
323 #+END_SRC
324 ** Coding style
325 #+BEGIN_SRC emacs-lisp
326 (setq c-default-style "linux")
327 #+END_SRC
328
329 ** Coding system
330 #+BEGIN_SRC emacs-lisp
331 (set-terminal-coding-system 'utf-8)
332 (set-keyboard-coding-system 'utf-8)
333 (set-language-environment "UTF-8")
334 (prefer-coding-system 'utf-8)
335 (setq-default indent-tabs-mode t)
336 (delete-selection-mode)
337 (global-set-key (kbd "RET") 'newline-and-indent)
338 #+END_SRC
339 ** Move to beginning of line ignoring whitespace
340 Move point back to indentation of beginning of line.
341
342 Move point to the first non-whitespace character on this line.
343 If point is already there, move to the beginning of the line.
344 Effectively toggle between the first non-whitespace character and
345 the beginning of the line.
346
347 If ARG is not nil or 1, move forward ARG - 1 lines first. If
348 point reaches the beginning or end of the buffer, stop there.
349 #+BEGIN_SRC emacs-lisp
350 (defun prelude-move-beginning-of-line (arg)
351   (interactive "^p")
352   (setq arg (or arg 1))
353
354   ;; Move lines first
355   (when (/= arg 1)
356     (let ((line-move-visual nil))
357       (forward-line (1- arg))))
358
359   (let ((orig-point (point)))
360     (back-to-indentation)
361     (when (= orig-point (point))
362       (move-beginning-of-line 1))))
363
364 (global-set-key (kbd "C-a") 'prelude-move-beginning-of-line)
365 #+END_SRC
366 ** Indent region or buffer
367 #+BEGIN_SRC emacs-lisp
368 (defun indent-region-or-buffer ()
369   "Indent a region if selected, otherwise the whole buffer."
370   (interactive)
371   (unless (member major-mode prelude-indent-sensitive-modes)
372     (save-excursion
373       (if (region-active-p)
374           (progn
375             (indent-region (region-beginning) (region-end))
376             (message "Indented selected region."))
377         (progn
378           (indent-buffer)
379           (message "Indented buffer.")))
380       (whitespace-cleanup))))
381
382 (global-set-key (kbd "C-c i") 'indent-region-or-buffer)
383 #+END_SRC
384 ** Tramp
385 #+BEGIN_SRC emacs-lisp
386   (when (eq system-type 'windows-nt)
387     (setq tramp-default-method "plink"))
388   (setq password-cache-expiry nil)
389 #+END_SRC
390
391 * Mode line tweaks
392 Diminish is used but is included in init.el such that it can be used throughout this document
393 ** Spaceline
394 A little easier to read than the default emacs mode line
395 #+BEGIN_SRC emacs-lisp
396   (use-package spaceline
397     :ensure t
398     :config
399     (require 'spaceline-config)
400     (setq spaceline-buffer-encoding-abbrev-p t)
401     (setq spaceline-line-column-p t)
402     (setq spaceline-line-p t)
403     (setq powerline-default-separator (quote arrow))
404     (spaceline-spacemacs-theme))
405 #+END_SRC
406 ** No separator
407 #+BEGIN_SRC emacs-lisp
408 (setq powerline-default-seperator nil)
409 #+END_SRC
410 * Programming tweaks
411 ** Yasnippet
412 #+BEGIN_SRC emacs-lisp
413   (use-package yasnippet
414     :ensure t
415     :diminish yas-minor-mode
416     :config
417     (use-package yasnippet-snippets
418       :ensure t)
419     (yas-reload-all))
420 #+END_SRC
421 ** flycheck
422 #+BEGIN_SRC emacs-lisp
423 (use-package flycheck
424   :ensure t)
425 #+END_SRC
426 *** flycheck-pos-tip
427 #+BEGIN_SRC emacs-lisp
428 (use-package flycheck-pos-tip
429   :ensure t
430   :after flycheck
431   :config
432   (flycheck-pos-tip-mode))
433 #+END_SRC
434 ** Company
435 Company is auto-complete for emacs
436 #+BEGIN_SRC emacs-lisp
437   (use-package company
438     :ensure t
439     :hook (prog-mode)
440     :config
441     (setq company-idle-delay 0)
442     (setq company-minimum-prefix-length 3))
443 #+END_SRC
444 ** Language specific configs
445 *** C/C++
446 **** yasnippet
447 #+BEGIN_SRC emacs-lisp
448 (add-hook 'c++-mode-hook 'yas-minor-mode)
449 (add-hook 'c-mode-hook 'yas-minor-mode)
450 #+END_SRC
451 **** flycheck clang
452 #+BEGIN_SRC emacs-lisp
453 (use-package flycheck-clang-analyzer
454   :ensure t
455   :config
456   (with-eval-after-load 'flycheck
457     (require 'flycheck-clang-analyzer)
458      (flycheck-clang-analyzer-setup)))
459 #+END_SRC
460 **** company
461 #+BEGIN_SRC emacs-lisp
462   (add-hook 'c-mode-common-hook
463         (lambda ()
464           (define-key c-mode-base-map  [(tab)] 'company-complete))))
465
466     (use-package company-c-headers
467     :ensure t
468     :after company
469     :config
470     (add-hook 'c++-mode-hook 'company-mode)
471     (add-hook 'c-mode-hook 'company-mode))
472
473     (use-package company-irony
474       :ensure t
475       :config
476       (add-to-list company-backends '((company-c-headers
477                        company-dabbrev-code
478                        company-irony))))
479
480     (use-package irony
481       :ensure t
482       :config
483       (add-hook 'c++-mode-hook 'irony-mode)
484       (add-hook 'c-mode-hook 'irony-mode)
485       (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))
486 #+END_SRC
487 *** emacs-lisp
488 **** eldoc
489 #+BEGIN_SRC emacs-lisp
490 (add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
491 #+END_SRC
492 **** yasnippet
493 #+BEGIN_SRC emacs-lisp
494 (add-hook 'emacs-lisp-mode-hook 'yas-minor-mode)
495 #+END_SRC
496 **** company
497 #+BEGIN_SRC emacs-lisp
498 (add-hook 'emacs-lisp-mode-hook 'company-mode)
499
500 (use-package slime
501   :ensure t
502   :config
503   (setq inferior-lisp-program "/usr/bin/sbcl")
504   (setq slime-contribs '(slime-fancy)))
505
506 (use-package slime-company
507   :ensure t
508   :init
509     (require 'company)
510     (slime-setup '(slime-fancy slime-company)))
511 #+END_SRC
512 *** x86
513 **** x86-lookup
514 #+BEGIN_SRC emacs-lisp
515 (use-package x86-lookup
516   :ensure t
517   :init
518   (setq x86-lookup-pdf "D:/Coding/x86-instructions.pdf")
519   :bind ("C-h x" . x86-lookup))
520 #+END_SRC
521 *** Latex
522 **** AucTex
523 #+BEGIN_SRC emacs-lisp
524 (use-package tex
525   :ensure auctex
526   :config
527   (setq TeX-auto-save t)
528   (setq TeX-parse-self t)
529   (setq doc-view-ghostscript-program "c:/msys64/mingw64/bin/gswin32c.exe")
530   (setq preview-gs-command "c:/msys64/mingw64/bin/gs.exe"))
531 #+END_SRC
532 **** Company
533 #+BEGIN_SRC emacs-lisp
534   (use-package company-math
535     :ensure t
536     :after company
537     :config
538     (add-to-list 'company-backends 'company-math-symbols-unicode))
539 #+END_SRC
540 **** Preview pane
541 #+BEGIN_SRC emacs-lisp
542 (use-package latex-preview-pane
543   :ensure t
544   :config
545   (latex-preview-pane-enable))
546 #+END_SRC
547 *** PlantUML
548 #+BEGIN_SRC emacs-lisp
549 (use-package plantuml-mode
550   :ensure t
551   :init
552   (setq plantuml-jar-path "c:/ProgramData/chocolatey/lib/plantuml/tools/plantuml.jar"))
553 #+END_SRC
554 ** Magit
555 #+BEGIN_SRC emacs-lisp
556 (use-package magit
557   :ensure t
558   :commands magit-get-top-dir
559   :bind ("C-x g" . magit-status)
560   :init
561   (progn
562     ;; make magit status go full-screen but remember previous window
563     ;; settings
564     ;; from: http://whattheemacsd.com/setup-magit.el-01.html
565     (defadvice magit-status (around magit-fullscreen activate)
566       (window-configuration-to-register :magit-fullscreen)
567       ad-do-it
568       (delete-other-windows))
569
570     ;; Close popup when committing - this stops the commit window
571     ;; hanging around
572     ;; From: http://git.io/rPBE0Q
573     (defadvice git-commit-commit (after delete-window activate)
574       (delete-window))
575
576     (defadvice git-commit-abort (after delete-window activate)
577       (delete-window))
578
579   :config
580   (progn
581     ;; restore previously hidden windows
582     (defadvice magit-quit-window (around magit-restore-screen activate)
583       (let ((current-mode major-mode))
584         ad-do-it
585         ;; we only want to jump to register when the last seen buffer
586         ;; was a magit-status buffer.
587         (when (eq 'magit-status-mode current-mode)
588           (jump-to-register :magit-fullscreen)))))
589
590   ;; magit settings
591   (setq
592    ;; don't put "origin-" in front of new branch names by default
593    magit-default-tracking-name-function 'magit-default-tracking-name-branch-only
594    ;; open magit status in same window as current buffer
595    magit-status-buffer-switch-function 'switch-to-buffer
596    ;; highlight word/letter changes in hunk diffs
597    magit-diff-refine-hunk t
598    ;; ask me if I want to include a revision when rewriting
599    magit-rewrite-inclusive 'ask
600    ;; ask me to save buffers
601    magit-save-some-buffers t
602    ;; pop the process buffer if we're taking a while to complete
603    magit-process-popup-time 10
604    ;; ask me if I want a tracking upstream
605    magit-set-upstream-on-push 'askifnotset
606    )))
607 #+END_SRC
608 ** CEDET
609 *** semantic
610 #+BEGIN_SRC emacs-lisp
611 (use-package semantic
612   :config
613   (global-semanticdb-minor-mode 1)
614   (global-semantic-idle-scheduler-mode 1)
615   (global-semantic-idle-summary-mode 1)
616   (semantic-mode 1))
617 #+END_SRC
618 *** EDE
619 #+BEGIN_SRC emacs-lisp
620 (use-package ede
621   :config
622   (global-ede-mode t))
623 #+END_SRC
624 *** gdb-many-windows
625 #+BEGIN_SRC emacs-lisp
626 (setq
627  ;; use gdb-many-windows by default
628  gdb-many-windows t
629
630  ;; Non-nil means display source file containing the main routine at startup
631  gdb-show-main t)
632 #+END_SRC
633 *** Semantic refactor
634 #+BEGIN_SRC emacs-lisp
635 (use-package srefactor
636   :ensure t
637   :bind (("M-RET o" . 'srefactor-lisp-one-line)
638      ("M-RET m" . 'srefactor-lisp-format-sexp)
639      ("M-RET d" . 'srefactor-lisp-format-defun)
640      ("M-RET b" . 'srefactor-lisp-format-buffer)
641      :map c-mode-base-map
642           ("M-RET" . 'srefactor-refactor-at-point)
643           :map c++-mode-map
644           ("M-RET" . 'srefactor-refactor-at-point)))
645 #+END_SRC
646 * Org mode
647 ** Up to date org
648 #+BEGIN_SRC emacs-lisp
649     (use-package org
650       :ensure t
651       :pin org)
652 #+END_SRC
653 ** Small tweaks
654 #+BEGIN_SRC emacs-lisp
655 (setq org-src-fontify-natively t)
656 (setq org-src-tab-acts-natively t)
657 (setq org-confirm-babel-evaluate nil)
658 (setq org-export-with-smart-quotes t)
659 (setq org-src-window-setup 'current-window)
660 (add-hook 'org-mode-hook 'org-indent-mode)
661 #+END_SRC
662 ** Line wrapping
663 #+BEGIN_SRC emacs-lisp
664   (add-hook 'org-mode-hook
665           '(lambda ()
666          (visual-line-mode 1)))
667 #+END_SRC
668 ** org-bullets
669 #+BEGIN_SRC emacs-lisp
670 (use-package org-bullets
671   :ensure t
672   :config
673     (add-hook 'org-mode-hook (lambda () (org-bullets-mode))))
674 #+END_SRC