#+TITLE: Oreodave's Emacs configuration #+AUTHOR: Oreodave #+DESCRIPTION: My Doom Emacs configuration! * Preclude - This is my [[https://github.com/hlissner/doom-emacs][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 (▀̿Ĺ̯▀̿̿) #+BEGIN_SRC elisp (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))) #+END_SRC ** 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 #+BEGIN_SRC elisp (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=) #+END_SRC ** HACK: Load org mode again? #+BEGIN_SRC elisp (load (expand-file-name (concat user-emacs-directory "modules/lang/org/config.el"))) #+END_SRC * Use package Load up a ton of packages #+BEGIN_SRC elisp (add-hook 'doom-after-init-modules-hook #'(lambda () (interactive) (use-package projectile) (use-package counsel))) #+END_SRC * Package Configuration Configuration for or based heavily around specific packages that I find very important ** Modeline #+BEGIN_SRC elisp (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)) #+END_SRC ** 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 - *cD* starts up the routine #+BEGIN_SRC elisp (after! dap-mode (defun dx:debug () (interactive) (dap-ui-mode) (dap-ui-locals) (dap-ui-sessions))) #+END_SRC *** Keybind #+BEGIN_SRC elisp (map! :after dap-mode :leader :desc "Start debugging setup" "cD" #'dx:debug) #+END_SRC ** Spelling checker Keybinds to org-mode for flyspell package #+BEGIN_SRC elisp (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) #+END_SRC ** Projectile Add CMakeLists.txt to projectile-project-roots. #+BEGIN_SRC elisp (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")) #+END_SRC ** 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. #+BEGIN_SRC elisp (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 "•")) #+END_SRC The 'x' symbol in the =+pretty-code-fira-code-font-ligatures= is annoying, and unneeded. So I remove it. #+BEGIN_SRC elisp (assoc-delete-all "x" +pretty-code-fira-code-font-ligatures #'string=) #+END_SRC *** 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. #+BEGIN_SRC elisp (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")) #+END_SRC ** Calc *** Configuration #+BEGIN_SRC elisp (use-package! calc :config (setq calc-angle-mode 'rad) (map! :leader :desc "Calc" ":" #'calc)) #+END_SRC ** 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. #+BEGIN_SRC elisp (map! :map dired-mode-map :n "!" #'dired-do-async-shell-command :n "&" #'dired-do-shell-command) #+END_SRC ** Compilation Add keybind to recompile (inside the buffer) #+BEGIN_SRC elisp (map! (:map 'compilation-mode-map :n "u" #'recompile)) #+END_SRC ** Company #+BEGIN_SRC elisp (add-hook 'company-mode-hook #'(lambda () (setq company-frontends '(company-preview-frontend company-pseudo-tooltip-frontend)))) #+END_SRC * 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. #+BEGIN_SRC elisp (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")) #+END_SRC ** 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 #+BEGIN_SRC elisp (after! python (setq python-version-checked t) (setq python-python-command "python3") (setq python-shell-interpreter "python3") (setq flycheck-python-pycompile-executable "python3")) #+END_SRC *** 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. #+BEGIN_SRC elisp (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))) #+END_SRC ** 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 #+BEGIN_SRC elisp (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)))) #+END_SRC ** Org Org configuration to maximise org workflow. *** Org variables Setup the agenda-files and the org-directory. #+BEGIN_SRC elisp (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)) #+END_SRC *** Fragtog #+BEGIN_SRC elisp (use-package! org-fragtog :config (add-hook 'org-mode-hook #'org-fragtog-mode)) #+END_SRC *** Thesaurus Powerthesaurus installation, added a keybind in org-mode for looking up words. #+BEGIN_SRC elisp (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)) #+END_SRC 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 #+BEGIN_SRC elisp (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) #+END_SRC ** Haskell Setup repl binds for Haskell #+BEGIN_SRC elisp (map! :after haskell-mode :map haskell-mode-map :localleader "l" #'haskell-process-load-file "r" #'haskell-process-reload "o" #'haskell-process-start) #+END_SRC ** Sxhkd Define a major-mode for sxhkd config files. #+BEGIN_SRC elisp (define-generic-mode sxhkd-mode '(?#) '("alt" "Escape" "super" "bspc" "ctrl" "space" "shift" "hyper" "XF86*") '("{" "}") '("sxhkdrc") nil "Simple mode for sxhkdrc files.") #+END_SRC * 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. #+BEGIN_SRC elisp (load (concat doom-private-dir "+keymap.el")) #+END_SRC