9.9 KiB
Oreodave's Emacs configuration
Preclude
- This is my Doom Emacs configuration.
- Use it for most of my code editing and development needs.
- Incredibly versatile tool in my inventory.
Initial setup
Doom Variables
-
Good font choices:
- Hack
- Source Code Pro/Variable
- IBM Plex Mono
- Space Mono
- Z003 if I'm feeling fancy (▀̿Ĺ̯▀̿̿)
(after! core-keybinds
(map! :leader "," nil)
(setq doom-themes-enable-italic nil
doom-themes-enable-bold t
doom-theme 'derivative-new-molokai
doom-font (font-spec :family "Source Code Pro" :size 15)))
Other variables
Some quality of life things and others that I couldn't really put in one category
- Using line-numbers that are relative now instead of nothing.
- Set org directory
- Add libgen to search providers
(setq completion-ignore-case t
truncate-lines t
display-line-numbers-type t
bookmark-default-file (expand-file-name (concat doom-private-dir "bookmarks")))
(setq-default frame-title-format '("%b - Emacs"))
(add-to-list 'default-frame-alist '(alpha . 90))
(cl-pushnew '("Libgen" "http://gen.lib.rus.ec/search.php?req=%s") +lookup-provider-url-alist :key #'car :test 'string=)
HACK: Load org mode again?
(load (expand-file-name (concat user-emacs-directory "modules/lang/org/config.el")))
Package Configuration
Configuration for or based heavily around specific packages that I find very important
Modeline
(setq-default mode-line-format (list "%l:%c \t %p \t %+%b(" '(:eval (format "%s" major-mode)) ") \t %I \t" vc-mode mode-line-end-spaces))
DAP
Function
First to setup is a routine for setting up all the dap-panes for debugging. Easier to do than just running all those functions manually
- Routine sets up the panes that I like to use, instead of M-x'ing it
- <SPC>cD starts up the routine
(after! dap-mode
(defun dx:debug ()
(interactive)
(dap-ui-mode)
(dap-ui-locals)
(dap-ui-sessions)))
Keybind
(map!
:after dap-mode
:leader
:desc "Start debugging setup" "cD" #'dx:debug)
Spelling checker
Keybinds to org-mode for flyspell package
(map!
:after (flyspell org)
:localleader
:map org-mode-map
:prefix "w"
:desc "Correct current word" "c" #'flyspell-correct-at-point
:desc "Autocorrect word" "a" #'flyspell-auto-correct-word
:desc "Goto next error" "w" #'flyspell-goto-next-error)
Projectile
Add CMakeLists.txt to projectile-project-roots.
(after! projectile
(cl-pushnew "CMakeLists.txt" projectile-project-root-files :test 'string=)
(setq projectile-tags-command
"ctags -e -R --exclude=dist --exclude=.ccls --exclude=.ccls-cache"))
Prettify symbols
Configuration for the module (pretty-code).
Setup symbols
Some symbols aren't present in the current doom version, or my fonts are screwing up, so I wrote them here. Maybe a bit of a bandage over broken glass, but at least it's something.
(setq +pretty-code-symbols
'(:name "»"
:src_block "»"
:src_block_end "«"
:quote "“"
:quote_end "”"
:lambda "λ"
:def "ƒ"
:composition "∘"
:map "↦"
:null "∅"
:true "𝕋"
:false "𝔽"
:int "ℤ"
:float "ℝ"
:str "𝕊"
:bool "𝔹"
:not "¬"
:in "∈"
:not-in "∉"
:and "∧"
:or "∨"
:for "∀"
:some "∃"
:return "⟼"
:yield "⟻"
:tuple "⨂"
:pipe "|"
:dot "•"))
The 'x' symbol in the +pretty-code-fira-code-font-ligatures is annoying, and unneeded.
So I remove it.
(assoc-delete-all "x" +pretty-code-fira-code-font-ligatures #'string=)
Pretty symbols
Setup pretty symbols specifically for C++. I import the string type via `using std::string` which isn't supported in standard doom so I added support for it as well.
(after! cc-mode
(set-pretty-symbols!
'(c-mode c++-mode)
:return "return"
:or "||"
:and "&&"
:not "!"
:bool "bool"
:str "string"
:str "std::string"
:float "float"
:int "int"
:false "false"
:true "true"
:null "nullptr"))
Calc
Configuration
(use-package! calc
:config
(setq calc-angle-mode 'rad)
(map!
:leader
:desc "Calc" ":" #'calc))
Dired and ranger
I like doing shell comamnds from dired, but I don't want Emacs to hang when doing them. So, as '!' is a common use command and "&" is the async comamnd, I'll just switcheroo the "!" and "&" for their designated commands.
(map!
:map dired-mode-map
:n "!" #'dired-do-async-shell-command
:n "&" #'dired-do-shell-command)
Compilation
Add keybind to recompile (inside the buffer)
(map!
(:map 'compilation-mode-map
:n "u" #'recompile))
Company
(add-hook
'company-mode-hook
#'(lambda () (setq company-frontends '(company-preview-frontend company-pseudo-tooltip-frontend))))
Language Configuration
Configuration for various languages which I feel can be useful
C-style languages
Configuration for C and C++. Emacs doesn't have the full range of styles that I want, so lemme just do it myself.
(after! cc-mode
(c-add-style
"user"
'((c-basic-offset . 2)
(c-comment-only-line-offset . 0)
(c-hanging-braces-alist (brace-list-open)
(brace-entry-open)
(substatement-open after)
(block-close . c-snug-do-while)
(arglist-cont-nonempty))
(c-cleanup-list brace-else-brace)
(c-offsets-alist
(statement-block-intro . +)
(knr-argdecl-intro . 0)
(substatement-open . 0)
(substatement-label . 0)
(access-label . 0)
(label . 0)
(statement-cont . +))))
(setq c-default-style "user"))
Python
Configuration for the Python language in doom
Set interpreter and flycheck to Python 3
I do python development for Python3 so I need to set the flycheck python checker, as well as the interpreter, to be Python3
(after! python
(setq python-version-checked t)
(setq python-python-command "python3")
(setq python-shell-interpreter "python3")
(setq flycheck-python-pycompile-executable "python3"))
Map to python-mode-map
Most of my python work is in scripts or ideas, so I don't need extensive testing utilities or anything like that I adhere greatly to the REPL in python, so I need access to it often.
(after! python
(map! ; Python keybinds
:map python-mode-map
:localleader
:desc "Start python minor" "c" #'run-python
:desc "Format buffer" "=" #'py-yapf-buffer
(:prefix "s"
:desc "Send region REPL" "r" #'python-shell-send-region
:desc "Send buffer" "b" #'python-shell-send-buffer
:desc "Send function" "f" #'python-shell-send-defun)))
Typescript
- Typescript (in my opinion) should be indented by 2
- Setup the LSP server on the lsp-language-id-config in case it hasn't already
(after! typescript-mode
(setq typescript-indent-level 2)
(setq tide-format-options '(:indentSize 2 :tabSize 2))
(after! lsp
(cl-pushnew '(typescript-mode . "typescript") lsp-language-id-configuration :key #'car)
(lsp-register-client
(make-lsp-client
:new-connection (lsp-stdio-connection "typescript-language-server --stdio")
:major-modes '(typescript-mode)
:server-id 'typescript))))
Org
Org configuration to maximise org workflow.
Org variables
Setup the agenda-files and the org-directory.
(after! org
(add-hook 'org-mode-hook #'visual-line-mode)
(add-hook 'org-mode-hook #'org-toggle-latex-fragment)
(setq org-directory "~/Text"
org-agenda-files '("~/Text/")
org-src-window-setup 'split-window-right
org-superstar-headline-bullets-list '("◉" "‣" "⧈" "⬠")
org-log-repeat 'note))
Fragtog
(use-package! org-fragtog
:config
(add-hook 'org-mode-hook #'org-fragtog-mode))
Thesaurus
Powerthesaurus installation, added a keybind in org-mode for looking up words.
(use-package! powerthesaurus
:after-call (org-mode)
:defer-incrementally (org)
:config
(map!
:localleader
:map org-mode-map
:prefix "w"
:desc "Thesaurus" "t" #'powerthesaurus-lookup-word-at-point))
Powerthesaurus for thesaurus on writer files
Org keymap
- I like using org-export often, so bind it to a primary bind.
- Loading latex fragments is nice
(map! ; Org keybinds
:after org
:map org-mode-map
:localleader
:desc "Org dispatch" "e" #'org-export-dispatch
:desc "Org LaTeX" "E" #'org-latex-export-as-latex)
Haskell
Setup repl binds for Haskell
(map!
:after haskell-mode
:map haskell-mode-map
:localleader
"l" #'haskell-process-load-file
"r" #'haskell-process-reload
"o" #'haskell-process-start)
Sxhkd
Define a major-mode for sxhkd config files.
(define-generic-mode sxhkd-mode
'(?#)
'("alt" "Escape" "super" "bspc" "ctrl" "space" "shift" "hyper" "XF86*")
'("{" "}")
'("sxhkdrc")
nil
"Simple mode for sxhkdrc files.")
Key-map
General keymap, load the keymap elisp file. This elisp file is basically two big maps, which are better explained in that document than this one. Furthermore, debugging and working on that document is something I do so often, it's just better to do it in an Elisp file than a org file.
(load (concat doom-private-dir "+keymap.el"))