476 lines
13 KiB
Org Mode
476 lines
13 KiB
Org Mode
#+options: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
|
|
#+options: author:t broken-links:nil c:nil creator:nil
|
|
#+options: d:(not "LOGBOOK") date:t e:t email:nil f:t inline:t num:t
|
|
#+options: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t
|
|
#+options: timestamp:t title:t toc:t todo:t |:t
|
|
#+title: Universe Emacs Config
|
|
#+author:
|
|
#+language: en
|
|
|
|
* Intialization
|
|
|
|
We must initialize =leaf.el=, which we use as a use-package
|
|
replacement for defining configs for different things.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
;; <leaf-install-code>
|
|
(eval-and-compile
|
|
(customize-set-variable
|
|
'package-archives '(("org" . "https://orgmode.org/elpa/")
|
|
("melpa" . "https://melpa.org/packages/")
|
|
("gnu" . "https://elpa.gnu.org/packages/")))
|
|
(package-initialize)
|
|
(unless (package-installed-p 'leaf)
|
|
(package-refresh-contents)
|
|
(package-install 'leaf))
|
|
|
|
(leaf leaf-keywords
|
|
:ensure t
|
|
:init
|
|
(leaf el-get :ensure t)
|
|
(leaf hydra :ensure t)
|
|
(leaf blackout :ensure t)
|
|
|
|
:config
|
|
;; initialize leaf-keywords.el
|
|
(leaf-keywords-init)))
|
|
;; </leaf-install-code>
|
|
|
|
(leaf leaf-tree :ensure t)
|
|
(leaf leaf-convert :ensure t)
|
|
(leaf transient-dwim
|
|
:ensure t
|
|
:bind (("M-=" . transient-dwim-dispatch)))
|
|
#+end_src
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf custom-el
|
|
:config
|
|
;; Ensure custom writes to specific file
|
|
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
|
|
(load custom-file 'noerror 'nomessage))
|
|
#+end_src
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf backup
|
|
:config
|
|
;; Change the location of file backups/locks into the emacs.d/backups/
|
|
(setq backup-directory-alist
|
|
`(("." . ,(concat user-emacs-directory "backups")))))
|
|
#+end_src
|
|
|
|
* Visual Customization
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf visual
|
|
:doc "Visual Changes to Emacs"
|
|
:tag "builtin" "internal"
|
|
:custom ((menu-bar-mode . nil)
|
|
(tool-bar-mode . nil)
|
|
(scroll-bar-mode . nil))
|
|
:custom-face ((default . '((t (:family "JuliaMono"
|
|
:height 150
|
|
:weight normal)))))
|
|
:config (prog1 'visual
|
|
;; Set location of custom theme dir
|
|
(setq custom-theme-directory (concat user-emacs-directory "themes"))
|
|
(load-theme 'UniverseHighContrast)))
|
|
#+end_src
|
|
|
|
* Package Configuration
|
|
|
|
** Path Preservation
|
|
|
|
Exec-path-from-shell ensures that path variable is preserved from
|
|
shell.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf exec-path-from-shell :ensure t
|
|
:config
|
|
(exec-path-from-shell-initialize))
|
|
#+end_src
|
|
|
|
** Font Related
|
|
|
|
*** Ligature
|
|
|
|
Font related ligatures, combining multiple characters into "one".
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf ligature
|
|
:ensure t
|
|
:config
|
|
;; Enable the "www" ligature in every possible major mode
|
|
(ligature-set-ligatures 't '("www"))
|
|
;; Enable traditional ligature support in eww-mode, if the
|
|
;; `variable-pitch' face supports it
|
|
(ligature-set-ligatures 'eww-mode '("ff" "fi" "ffi"))
|
|
;; Enable all Cascadia Code ligatures in programming modes
|
|
(ligature-set-ligatures 'prog-mode '("|||>" "<|||" "<==>" "<!--" "####" "~~>" "***" "||=" "||>"
|
|
":::" "::=" "=:=" "===" "==>" "=!=" "=>>" "=<<" "=/=" "!=="
|
|
"!!." ">=>" ">>=" ">>>" ">>-" ">->" "->>" "-->" "---" "-<<"
|
|
"<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->"
|
|
"<--" "<-<" "<<=" "<<-" "<<<" "<+>" "</>" "###" "#_(" "..<"
|
|
"..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~="
|
|
"~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|"
|
|
"[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:"
|
|
">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:"
|
|
"<$" "<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#=" "#!"
|
|
"##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?" "+>" "++" "?:"
|
|
"?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)"
|
|
"\\\\" "://"))
|
|
;; Enables ligature checks globally in all buffers. You can also do it
|
|
;; per mode with `ligature-mode'.
|
|
(global-ligature-mode t))
|
|
#+end_src
|
|
|
|
** Profiling
|
|
#+begin_src elisp :tangle yes
|
|
(leaf esup :disabled nil :ensure t)
|
|
#+end_src
|
|
|
|
** Version Control
|
|
#+begin_src elisp :tangle yes
|
|
(leaf magit :ensure t :require t)
|
|
#+end_src
|
|
|
|
** Nix Related
|
|
|
|
*** Direnv
|
|
|
|
In order to support direnv (loading =nix-shell= / =nix develop=)
|
|
#+begin_src elisp :tangle yes
|
|
(leaf direnv
|
|
:ensure t
|
|
:config
|
|
(direnv-mode))
|
|
#+end_src
|
|
|
|
*** Nix-mode
|
|
|
|
=.nix= file mode
|
|
#+begin_src elisp :tangle yes
|
|
(leaf nix-mode :ensure t)
|
|
#+end_src
|
|
|
|
** WEB
|
|
|
|
We all know the web is the future, obviously, of course.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf web-mode
|
|
:ensure t
|
|
:mode
|
|
"\\.p?html?\\'"
|
|
"\\.djtml\\'"
|
|
"\\.jsx?\\'"
|
|
"\\.tsx?\\'")
|
|
(leaf php-mode
|
|
:ensure t)
|
|
#+end_src
|
|
|
|
** D2
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf d2-mode :ensure t)
|
|
#+end_src
|
|
|
|
** YAML
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf yaml-mode :ensure t)
|
|
#+end_src
|
|
|
|
** IDE Like Things
|
|
*** Company Completion!
|
|
|
|
We like autocomplete, it... is nice, okay?
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf company :ensure t
|
|
:bind
|
|
(("C-<tab>" . company-complete))
|
|
:hook after-init-hook
|
|
:config (global-company-mode))
|
|
#+end_src
|
|
*** Language Server Protocol
|
|
|
|
We love language features that make languages nice
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf lsp-mode
|
|
:ensure t
|
|
:init
|
|
(setq lsp-keymap-prefix "C-c l")
|
|
:hook
|
|
((dart-mode-hook . lsp)
|
|
(python-mode-hook . lsp)
|
|
(c-mode-hook . lsp)
|
|
(c++-mode-hook . lsp)
|
|
(haskell-mode-hook . lsp)
|
|
(java-mode-hook . lsp)
|
|
(rust-mode-hook . lsp)
|
|
;; which key support v v v
|
|
(lsp-mode-hook . lsp-enable-which-key-integration))
|
|
:commands lsp
|
|
:config
|
|
(leaf lsp-ui :ensure t
|
|
:commands lsp-ui-mode)
|
|
(leaf flycheck :ensure t)
|
|
(leaf lsp-treemacs :ensure t
|
|
:commands lsp-treemacs-errors-list)
|
|
(leaf helm-lsp :ensure t
|
|
:commands helm-lsp-workspace-symbol)
|
|
(leaf dap-mode :ensure t)
|
|
(leaf which-key :ensure t
|
|
:config (which-key-mode)))
|
|
#+end_src
|
|
**** Projectile (Projects)
|
|
#+begin_src elisp :tangle yes
|
|
(leaf projectile
|
|
:commands projectile-mode
|
|
:config
|
|
(projectile-mode +1))
|
|
#+end_src
|
|
** Python Things
|
|
*** Python-mode
|
|
|
|
Using python-mode is to have more up to date features (and
|
|
highlighting) compared to builtin python-mode.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf python-mode :ensure t
|
|
:config
|
|
(setq python-shell-interpreter "ipython"
|
|
python-shell-interpreter-args "-i --simple-prompt --InteractiveShell.display_page=True"))
|
|
#+end_src
|
|
*** Poetry
|
|
|
|
For when we aren't nix'ing things, and want some nice poetry.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf poetry :ensure t)
|
|
#+end_src
|
|
** Java
|
|
|
|
LSP for java is /nice/.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf lsp-java
|
|
:hook (java-mode-hook . lsp))
|
|
#+end_src
|
|
** C
|
|
Who even needs C++, not me, no way, no how.
|
|
#+begin_src elisp :tangle yes
|
|
(leaf company-ctags :ensure t)
|
|
(leaf company-c-headers :ensure t)
|
|
(leaf meson-mode :ensure t)
|
|
#+end_src
|
|
** Haskell
|
|
#+begin_src elisp :tangle yes
|
|
(leaf haskell-mode :ensure t
|
|
:config
|
|
(leaf lsp-haskell :ensure t)
|
|
(leaf company-ghci :ensure t))
|
|
#+end_src
|
|
** Rust
|
|
#+begin_src elisp :tangle yes
|
|
(leaf rust-mode :ensure t)
|
|
#+end_src
|
|
** Minecraft??
|
|
Minecraft =mcfunction= support, because, it can be annoying to type
|
|
this stuff otherwise.
|
|
#+begin_src elisp :tangle yes
|
|
(leaf mcf-mode
|
|
:el-get rasensuihei/mcf)
|
|
#+end_src
|
|
** Lisps
|
|
|
|
Gonna need to have pretty brackets
|
|
#+begin_src elisp :tangle yes
|
|
(leaf rainbow-delimiters
|
|
:ensure t
|
|
:commands rainbow-delimiters-mode
|
|
:config
|
|
(leaf rainbow
|
|
:hook (emacs-lisp-mode-hook . rainbow-delimiters-mode)
|
|
(geiser-mode-hook . rainbow-delimiters-mode)))
|
|
#+end_src
|
|
*** Racket
|
|
Makes using racket so much nicer
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf geiser-racket :ensure t)
|
|
#+end_src
|
|
** Org
|
|
|
|
We use org-ref because it provides some niceties, like doi-utils for
|
|
updating our bibliography.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf ivy-bibtex :ensure t)
|
|
(leaf helm-bibtex :ensure t)
|
|
(leaf org-ref :ensure t
|
|
:after org
|
|
:init
|
|
(leaf pdf-tools :ensure t)
|
|
:config
|
|
(setq bibtex-completion-bibliography
|
|
(list (expand-file-name "~/Documents/Bibliography/references.bib")))
|
|
|
|
(setq org-ref-bibliography-notes "~/Documents/Bibliography/notes.org"
|
|
org-ref-default-bibliography '("~/Documents/Bibliography/references.bib")
|
|
org-ref-pdf-directory "~/Documents/Bibliography/bibtex-pdfs/")
|
|
|
|
(setq org-ref-insert-link-function 'org-ref-insert-link-hydra/body
|
|
org-ref-insert-cite-function 'org-ref-cite-insert-helm
|
|
org-ref-insert-label-function 'org-ref-insert-label-link
|
|
org-ref-insert-ref-function 'org-ref-insert-ref-link
|
|
org-ref-cite-onclick-function (lambda (_) (org-ref-citation-hydra/body)))
|
|
|
|
:require org-ref org-ref-ivy org-ref-helm doi-utils)
|
|
#+end_src
|
|
|
|
For more export formats we use pandoc:
|
|
#+begin_src elisp :tangle yes
|
|
(leaf ox-pandoc :ensure t
|
|
:after org)
|
|
#+end_src
|
|
|
|
Writing mockup presentations can be quicker when you focus on the text
|
|
of the presentation first, and prettifying later. Reveal.js is a nice
|
|
in between of these.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf ox-reveal :ensure t
|
|
:require t
|
|
:after org
|
|
:config
|
|
(setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js"))
|
|
#+end_src
|
|
|
|
Nicer LaTeX editing (AuCTeX):
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf auctex :ensure t
|
|
:after org)
|
|
#+end_src
|
|
|
|
We also ma(k|d)e use of org-tempo for templating things, which can be
|
|
nice. Should use the export based templating probably. Eventually.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf org-cfg
|
|
:after org
|
|
:require org-ref oc-csl org-tempo ox-latex ox-pandoc ox-reveal
|
|
:init
|
|
:bind*
|
|
("C-c ]" . org-ref-insert-link)
|
|
("s-[" . org-ref-insert-link-hydra/body)
|
|
:hook
|
|
(org-mode-hook . auto-fill-mode)
|
|
:config
|
|
(set-fill-column 100)
|
|
(setq org-src-fontify-natively t
|
|
org-confirm-babel-evaluate nil
|
|
org-src-preserve-indentation t)
|
|
|
|
(tempo-define-template "Fig. Caption"
|
|
'("" (P "Image: " image t)
|
|
(P "Caption: " caption t)
|
|
(P "Figure Name: " name t)
|
|
"#+CAPTION: " (s caption) > n >
|
|
"#+NAME: fig:" (s name) > n >
|
|
"#+ATTR_LaTeX: :placement [H]" > n >
|
|
"[[" (s image) "]]" > n > p >)
|
|
"<fig" "Inserts Figure with Caption")
|
|
(add-to-list 'org-latex-packages-alist '("" "minted"))
|
|
(setq org-latex-listings 'minted)
|
|
|
|
(add-to-list 'org-latex-classes
|
|
'("labtemplate" "\\documentclass{labtemplate}"
|
|
("\\section{%s}" . "\\section*{%s}")
|
|
("\\subsection{%s}" . "\\subsection*{%s}")
|
|
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
|
|
("\\paragraph{%s}" . "\\paragraph*{%s}")
|
|
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
|
|
)
|
|
|
|
(setq org-latex-pdf-process
|
|
'("%latex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
|
"%latex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
|
"bibtex %b"
|
|
"%latex -shell-escape -interaction nonstopmode -output-directory %o %f"
|
|
"%latex -shell-escape -interaction nonstopmode -output-directory %o %f")))
|
|
#+end_src
|
|
|
|
And in case we want to make some (GNU)?plots?
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf gnuplot
|
|
:ensure t)
|
|
#+end_src
|
|
|
|
*** Org Mode Agenda/Calendar Things
|
|
|
|
**** Agenda Location
|
|
Make it so that all files in the src_elisp{org-agenda-files} variable
|
|
(e.g. "=~/Documents=") will be included in the tablutation and
|
|
collation of all the dates and todos etc.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf org-agenda-file
|
|
:after org
|
|
:config
|
|
(setq org-agenda-files '("~/Documents/org")))
|
|
#+end_src
|
|
|
|
**** Capture Things
|
|
|
|
Unless specified otherwise, any captured note, date, meeting, idea,
|
|
should be put into the src_elisp{org-directory}.
|
|
|
|
Similarly, we have a default file for notes that we capture, in there
|
|
=note.org=, which is where all captured things go when they aren't
|
|
told to go elsewhere.
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf org-capture-cfg
|
|
:after org
|
|
:config
|
|
(setq org-directory "~/Documents/org")
|
|
(setq org-default-notes-file (concat org-directory "/notes.org")))
|
|
#+end_src
|
|
|
|
We also want to configure what type of things we want to capture,
|
|
e.g. meetings, deadlines and whatever else:
|
|
|
|
#+begin_src elisp :tangle yes
|
|
(leaf org-capture-what
|
|
:after org
|
|
:config
|
|
(setq org-capture-templates
|
|
'(("t" "Todo" entry (file+headline "todo.org" "Tasks")
|
|
"* TODO %?\n %i\n %a")
|
|
("j" "Journal" entry (file+datetree "journal.org")
|
|
"* %?\nEntered on %U\n %i\n %a")
|
|
("m" "Meeting" entry (file+headline "dates.org" "Meetings")
|
|
"* %^{prompt}\n:PROPERTIES:\n:CATEGORY: Meeting\n:END:\nWhen: %^t\nAdded: %U\nTags: %^g\n%?"))))
|
|
#+end_src
|
|
|
|
** Flutter
|
|
#+begin_src elisp :tangle yes
|
|
(leaf dart-mode :ensure t)
|
|
(leaf lsp-dart :ensure t)
|
|
#+end_src
|
|
** BQN
|
|
#+begin_src elisp :tangle yes
|
|
(leaf bqn-mode
|
|
:el-get "museoa/bqn-mode"
|
|
:config
|
|
(leaf bqn-font
|
|
:after bqn-mode
|
|
:config
|
|
(set-face-attribute 'bqn-default nil :family 'unspecified)))
|
|
#+end_src
|