;;; init.el -*- lexical-binding: t; -*-

;; This file controls what Doom modules are enabled and what order they load in.
;; Press 'K' on a module to view its documentation, and 'gd' to browse its directory.

(doom! :input
       ;;bidi                       ; (tfel ot) thgir etirw uoy gnipleh
       ;;chinese
       ;;japanese
       ;;layout                     ; auie,ctsrnm is the superior home row

       :completion
       ;; company                   ; the ultimate code completion backend
       (corfu +orderless +dabbrev)  ; complete with cap(f), cape and a flying feather!
       ;;helm                       ; the *other* search engine for love and life
       ;;ido                        ; the other *other* search engine...
       ;; (ivy                      ; a search engine for love and life
       ;;  +icons                   ; ... icons are nice
       ;;  +prescient)              ; ... I know what I want(ed)
       (vertico +icons)             ; the search engine of the future

       :ui
       ;;deft                       ; notational velocity for Emacs
       doom                         ; what makes DOOM look the way it does
       doom-dashboard               ; a nifty splash screen for Emacs
       doom-quit                    ; DOOM quit-message prompts when you quit Emacs
       ;; (emoji +unicode)          ; 🙂
       ;;fill-column                ; a `fill-column' indicator
       hl-todo                      ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
       ;;hydra                      ; quick documentation for related commands
       ;;indent-guides              ; highlighted indent columns, notoriously slow
       (ligatures +extra)           ; ligatures and symbols to make your code pretty again
       ;;minimap                    ; show a map of the code on the side
       modeline                     ; snazzy, Atom-inspired modeline, plus API
       nav-flash                    ; blink the current line after jumping
       ;;neotree                    ; a project drawer, like NERDTree for vim
       ophints                      ; highlight the region an operation acts on
       (popup                       ; tame sudden yet inevitable temporary windows
        +all                        ; catch all popups that start with an asterix
        +defaults)                  ; default popup rules
       ;;(tabs                      ; an tab bar for Emacs
       ;;  +centaur-tabs)           ; ... with prettier tabs
       treemacs                     ; a project drawer, like neotree but cooler
       ;;unicode                    ; extended unicode support for various languages
       (vc-gutter +pretty)          ; vcs diff in the fringe
       vi-tilde-fringe              ; fringe tildes to mark beyond EOB
       (window-select +numbers)     ; visually switch windows
       workspaces                   ; tab emulation, persistence & separate workspaces
       zen                          ; distraction-free coding or writing

       :editor
       (evil +everywhere)           ; come to the dark side, we have cookies
       file-templates               ; auto-snippets for empty files
       fold                         ; (nigh) universal code folding
       (format)                     ; automated prettiness
       ;;god                        ; run Emacs commands without modifier keys
       ;;lispy                      ; vim for lisp, for people who don't like vim
       multiple-cursors             ; editing in many places at once
       ;;objed                      ; text object editing for the innocent
       ;;parinfer                   ; turn lisp into python, sort of
       rotate-text                  ; cycle region at point between text candidates
       snippets                     ; my elves. They type so I don't have to
       ;;word-wrap                  ; soft wrapping with language-aware indent

       :emacs
       (dired +icons)               ; making dired pretty [functional]
       electric                     ; smarter, keyword-based electric-indent
       (ibuffer +icons)             ; interactive buffer management
       undo                         ; persistent, smarter undo for your inevitable mistakes
       vc                           ; version-control and Emacs, sitting in a tree

       :term
       ;;eshell                     ; the elisp shell that works everywhere
       ;;shell                      ; simple shell REPL for Emacs
       ;;term                       ; basic terminal emulator for Emacs
       vterm                        ; the best terminal emulation in Emacs

       :checkers
       syntax                       ; tasing you for every semicolon you forget
       ;; spell                     ; tasing you for misspelling mispelling
       grammar                      ; tasing grammar mistake every you make

       :tools
       ansible                      ; a crucible for infrastructure as code
       biblio                       ; Writes a PhD for you (citation needed)
       ;;debugger                   ; FIXME stepping through code, to help you add bugs
       ;;direnv                     ; be direct about your environment
       docker                       ; port everything to containers
       ;;editorconfig               ; let someone else argue about tabs vs spaces
       ;;ein                        ; tame Jupyter notebooks with emacs
       (eval +overlay)              ; run code, run (also, repls)
       ;;gist                       ; interacting with github gists
       (lookup                      ; helps you navigate your code and documentation
        +dictionary                 ; dictionary/thesaurus is nice
        +docsets)                   ; ...or in Dash docsets locally
       lsp                          ; Language Server Protocol
       ;;macos                      ; MacOS-specific commands
       (magit                       ; a git porcelain for Emacs
        +forge)                     ; interface with git forges
       make                         ; run make tasks from Emacs
       ;;pass                       ; password manager for nerds
       pdf                          ; pdf enhancements
       ;;prodigy                    ; FIXME managing external services & code builders
       rgb                          ; creating color strings
       ;;taskrunner                 ; taskrunner for all your projects
       ;;terraform                  ; infrastructure as code
       ;;tmux                       ; an API for interacting with tmux
       ;;tree-sitter                ; syntax and parsing, sitting in a tree...
       upload                       ; map local to remote projects via ssh/ftp

       :os
       tty                          ; improve the terminal Emacs experience

       :lang
       ;;agda                       ; types of types of types of types...
       ;;beancount                  ; mind the GAAP
       ;;(cc +lsp)                  ; C > C++ == 1
       ;;clojure                    ; java with a lisp
       ;;common-lisp                ; if you've seen one lisp, you've seen them all
       ;;coq                        ; proofs-as-programs
       ;;crystal                    ; ruby at the speed of c
       ;;csharp                     ; unity, .NET, and mono shenanigans
       data                         ; config/data formats
       ;;(dart +flutter)            ; paint ui and not much else
       ;;dhall                      ; JSON with FP sprinkles
       ;;elixir                     ; erlang done right
       ;;elm                        ; care for a cup of TEA?
       emacs-lisp                   ; drown in parentheses
       ;;erlang                     ; an elegant language for a more civilized age
       ess                          ; emacs speaks statistics
       ;;faust                      ; dsp, but you get to keep your soul
       ;;fsharp                     ; ML stands for Microsoft's Language
       ;;fstar                      ; (dependent) types and (monadic) effects and Z3
       ;;gdscript                   ; the language you waited for
       ;;(graphql +lsp)             ; Give queries a REST
       (go +lsp)                    ; the hipster dialect
       ;;(haskell +lsp)             ; a language that's lazier than I am
       ;;hy                         ; readability of scheme w/ speed of python
       ;;idris                      ;
       json                         ; At least it ain't XML
       ;;(java +lsp)                ; the poster child for carpal tunnel syndrome
       (javascript +lsp)            ; all(hope(abandon(ye(who(enter(here))))))
       (julia +lsp)                 ; Python, R, and MATLAB in a blender
       ;;kotlin                     ; a better, slicker Java(Script)
       (latex                       ; writing papers in Emacs has never been so fun
        +latexmk                    ; what else would you use?
        +cdlatex                    ; quick maths symbols
        +fold)                      ; fold the clutter away nicities
       ;;lean                       ; proof that mathematicians need help
       ;;factor                     ; for when scripts are stacked against you
       ;;ledger                     ; an accounting system in Emacs
       lua                          ; one-based indices? one-based indices
       markdown                     ; writing docs for people to ignore
       ;;nim                        ; python + lisp at the speed of c
       nix                          ; I hereby declare "nix geht mehr!"
       ;;ocaml                      ; an objective camel
       (org                         ; organize your plain life in plain text
        +dragndrop                  ; drag & drop files/images into org buffers
        ;;+hugo                     ; use Emacs for hugo blogging
        +noter                      ; enhanced PDF notetaking
        +jupyter                    ; ipython/jupyter support for babel
        +pandoc                     ; export-with-pandoc support
        +gnuplot                    ; who doesn't like pretty pictures
        ;;+pomodoro                 ; be fruitful with the tomato technique
        +present                    ; using org-mode for presentations
        +roam2)                     ; wander around notes
       ;;php                        ; perl's insecure younger brother
       ;;plantuml                   ; diagrams for confusing people more
       ;;purescript                 ; javascript, but functional
       (python +lsp +pyright)       ; beautiful is better than ugly
       ;;qt                         ; the 'cutest' gui framework ever
       ;;racket                     ; a DSL for DSLs
       ;;raku                       ; the artist formerly known as perl6
       ;;rest                       ; Emacs as a REST client
       ;;rst                        ; ReST in peace
       ;;(ruby +rails)              ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
       (rust +lsp)                  ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
       ;;scala                      ; java, but good
       scheme                       ; a fully conniving family of lisps
       sh                           ; she sells {ba,z,fi}sh shells on the C xor
       ;;sml                        ; no, the /other/ ML
       ;;solidity                   ; do you need a blockchain? No.
       ;;swift                      ; who asked for emoji variables?
       ;;terra                      ; Earth and Moon in alignment for performance.
       web                          ; the tubes
       yaml                         ; JSON, but readable
       zig                          ; C, but simpler

       :email
       (:if (executable-find "mu") (mu4e +org))
       ;;notmuch
       ;;(wanderlust +gmail)

       :app
       ;;calendar                   ; A dated approach to timetabling
       ;;emms                       ; Multimedia in Emacs is music to my ears
       everywhere                   ; *leave* Emacs!? You must be joking.
       irc                          ; how neckbeards socialize
       (rss +org)                   ; emacs as an RSS reader
       ;;twitter                    ; twitter client https://twitter.com/vnought

       :config
       literate
       (default +bindings +smartparens)
       )