Skip to content

hjozwiak/doom.d

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Doom Configuration

Explanation

This is my personal Doom Emacs configuration, useful for those who want to use Doom Emacs and have it work (hopefully) with Emacspeak, which is a screenreader for Emacs.

Getting Set Up

In order for things to work properly, you are going to need a few base utilities.

UtilityDescription
EmacsThe text editor that serves as the basis for the rest of this configuration
Doom EmacsThe configuration framework for the stubborn Martian Hacker
EmacspeakThe screenreader that allows blind folks to use Emacs.
espeakA speech synthesizer that Emacspeak will use to provide spoken output
tclxProvides OS primitives for TCL
tclA scripting language that Emacspeak will uses
passA password storage utility.

Getting the Packages

Emacs, TCL, Pass, and tclx

These packages should be available in your repository on Linux systems, so installing them should be fairly easy.

espeak

As a matter of personal preference, I prefer to use espeak-ng instead of the classic espeak, though finding one such espeak should be fairly straightforward in your package manager.

Doom Emacs

Getting Doom can be done by running the cloning script or by entering the following into your terminal session.

git clone --recursive https://github.com/hlissner/doom-emacs ~/.emacs.d

Emacspeak

To install Emacspeak, you need to do a few more things. Start off by getting the repository:

git clone --recursive https://github.com/tvraman/emacspeak ~/emacspeak

Now, cd into the directory and make the Emacspeak pacage itself and the espeak speech server:

cd ~/emacspeak
make && make espeak

For ease of updating, here is a script that you can use to update Emacspeak.

cd ~/emacspeak
git pull
make clean
make -j$(nproc --all)

And with that done, we should be ready to rock.

The Original Initialization files

Let’s start off by getting an init.el file rolling, from which we will enable various Doom modules.

;;; init.el -*- lexical-binding: t; -*-
;; This file was generated by a tangle process; do not touch this, instead edit config.org
;; This file controls what Doom modules are enabled and what order they load
;; in. Remember to run 'doom sync' after modifying it!

;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's
;;      documentation. There you'll find a "Module Index" link where you'll find
;;      a comprehensive list of Doom's modules and what flags they support.

;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or
;;      'C-c c k' for non-vim users) to view its documentation. This works on
;;      flags as well (those symbols that start with a plus).
;;
;;      Alternatively, press 'gd' (or 'C-c c d') on a module to browse its
;;      directory (for easy access to its source code).

(doom! :input
       ;;chinese
       ;;japanese
       ;;layout            ; auie,ctsrnm is the superior home row

       :completion
       (company +childframe)           ; the ultimate code completion backend
       ;;helm              ; the *other* search engine for love and life
       ;;ido               ; the other *other* search engine...
       ;;ivy               ; a search engine for love and life
       vertico           ; 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 +ascii +github +unicode)  ; 🙂
       hl-todo           ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
       hydra
       ;;indent-guides     ; highlighted indent columns
       ;;ligatures         ; 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 cursor line after big motions
       ;;neotree           ; a project drawer, like NERDTree for vim
       ophints           ; highlight the region an operation acts on
       (popup +defaults)   ; tame sudden yet inevitable temporary windows
       ;;tabs              ; a tab bar for Emacs
       ;;treemacs          ; a project drawer, like neotree but cooler
       unicode           ; extended unicode support for various languages
       vc-gutter         ; vcs diff in the fringe
       vi-tilde-fringe   ; fringe tildes to mark beyond EOB
       ;;window-select     ; 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 +onsave)  ; 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             ; making dired pretty [functional]
       electric          ; smarter, keyword-based electric-indent
       ibuffer         ; 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 +flyspell) ; tasing you for misspelling mispelling
       grammar           ; tasing grammar mistake every you make

       :tools
       ansible
       ;;biblio            ; Writes a PhD for you (citation needed)
       debugger          ; FIXME stepping through code, to help you add bugs
       ;;direnv
       ;;docker
       ;;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              ; navigate your code and its documentation
       lsp               ; M-x vscode
       (magit  +forge)            ; a git porcelain for Emacs
       ;;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
       ;;upload            ; map local to remote projects via ssh/ftp

       :os
       (:if IS-MAC macos)  ; improve compatibility with macOS
       ;;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 +dotnet +lsp)            ; unity, .NET, and mono shenanigans
       data              ; config/data formats
       (dart +flutter)   ; paint ui and not much else
       ;;dhall
       (elixir +lsp)            ; erlang done right
       ;;elm               ; care for a cup of TEA?
       emacs-lisp        ; drown in parentheses
       (erlang +lsp)            ; an elegant language for a more civilized age
       ;;ess               ; emacs speaks statistics
       ;;factor
       ;;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
       (go +lsp)         ; the hipster dialect
       (haskell +lsp)    ; a language that's lazier than I am
       ;;hy                ; readability of scheme w/ speed of python
       ;;idris             ; a language you can depend on
       (json +lsp)              ; At least it ain't XML
       (java +meghanada) ; the poster child for carpal tunnel syndrome
       (javascript +lsp)       ; all(hope(abandon(ye(who(enter(here))))))
       ;;julia             ; a better, faster MATLAB
       ;;kotlin            ; a better, slicker Java(Script)
       latex             ; writing papers in Emacs has never been so fun
       ;;lean              ; for folks with too much to prove
       ;;ledger            ; be audit you can be
       ;;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 +hugo)                ; organize your plain life in plain text
       ;;php               ; perl's insecure younger brother
       ;;plantuml          ; diagrams for confusing people more
       ;;purescript        ; javascript, but functional
       (python +lsp +poetry)            ; beautiful is better than ugly
       qt                ; the 'cutest' gui framework ever
       (racket +lsp +xp)            ; 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 +guile)   ; a fully conniving family of lisps
       (sh +lsp +powershell)                ; she sells {ba,z,fi}sh shells on the C xor
       ;;sml
       ;;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 +lsp)              ; JSON, but readable
       ;;zig               ; C, but simpler

       :email
       (mu4e +org +gmail)
       ;;notmuch
       ;;(wanderlust +gmail)

       :app
       ;;calendar
       ;;emms
       ;;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))

The next piece of configuration we will need to get out of the way is the pacages.el file, which should look something life this:

;; -*- no-byte-compile: t; -*-
;; This was generated by the tangling process, do not touch. Instead, use config.org
;;; $DOOMDIR/packages.el

;; To install a package with Doom you must declare them here and run 'doom sync'
;; on the command line, then restart Emacs for the changes to take effect -- or
;; use 'M-x doom/reload'.


;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror:
;(package! some-package)

;; To install a package directly from a remote git repo, you must specify a
;; `:recipe'. You'll find documentation on what `:recipe' accepts here:
;; https://github.com/raxod502/straight.el#the-recipe-format
;(package! another-package
;  :recipe (:host github :repo "username/repo"))

;; If the package you are trying to install does not contain a PACKAGENAME.el
;; file, or is located in a subdirectory of the repo, you'll need to specify
;; `:files' in the `:recipe':
;(package! this-package
;  :recipe (:host github :repo "username/repo"
;           :files ("some-file.el" "src/lisp/*.el")))

;; If you'd like to disable a package included with Doom, you can do so here
;; with the `:disable' property:
;(package! builtin-package :disable t)

;; You can override the recipe of a built in package without having to specify
;; all the properties for `:recipe'. These will inherit the rest of its recipe
;; from Doom or MELPA/ELPA/Emacsmirror:
;(package! builtin-package :recipe (:nonrecursive t))
;(package! builtin-package-2 :recipe (:repo "myfork/package"))

;; Specify a `:branch' to install a package from a particular branch or tag.
;; This is required for some packages whose default branch isn't 'master' (which
;; our package manager can't deal with; see raxod502/straight.el#279)
;(package! builtin-package :recipe (:branch "develop"))

;; Use `:pin' to specify a particular commit to install.
;(package! builtin-package :pin "1a2b3c4d5e")


;; Doom's packages are pinned to a specific commit and updated from release to
;; release. The `unpin!' macro allows you to unpin single packages...
;(unpin! pinned-package)
;; ...or multiple packages
;(unpin! pinned-package another-pinned-package)
;; ...Or *all* packages (NOT RECOMMENDED; will likely break things)
;(unpin! t)

And lastly, the configuration file config.el.

;; config.el, the configuration file for Doom Emacs.
;;; config.el -*- lexical-binding: t; -*-
;; Generated from config.org, do not manually edit.

Personalization

Now we can get into the meat and potatoes of configuring Doom Emacs, which is somewhat of an involved process. Here are some ideas you can use as a base, modifying them to suit your needs.

Identification Information

These values are used to identify me across Emacs.

(setq user-full-name "Hunter Jozwiak"
user-mail-address "hunter.t.joz@gmail.com")

Visual Things

The visual theme of Doom.

(setq doom-theme 'doom-one)

The Org Directory

Where I want my org things to go.

(setq org-directory "~/org")

Line Number Display

I don’t really like to hear line numbers as I move, so I will turn them off.

(setq display-line-numbers-type nil)

Emacspeak

First, we need to ensure that this file is loaded after initialization.

(add-hook 'after-init-hook (load "~/emacspeak/lisp/emacspeak-setup.el"))
(setq! espeak-default-speech-rate 820
       emacspeak-character-echo nil
       emacspeak-word-echo nil
       emacspeak-m-player-program "/usr/bin/mplayer")

IRC

I hang out mostly on the Liberachat, Zeronode and Stormux networks.

Libera.chat

(after! circe
  (set-irc-server! "irc.libera.chat"
    `(:tls t
      :port 6697
      :nic "sektor"
      :sasl-username ,(+pass-get-user "irc/libera.chat")
      :sasl-password (lambda (&rest _) (+pass-get-secret "irc/libera.chat"))
      :channels ("#emacs" "#stumpwm" "#pleroma" "#archlinux"))))

Stormux

(after! circe
  (set-irc-server! "irc.stormux.org"
    `(:tls t
      :port 6697
      :nic "sektor"
      :sasl-username ,(+pass-get-user "irc/talkabout.cf")
      :sasl-password (lambda (&rest _) (+pass-get-secret "irc/talkabout.cf"))
    :channels ("#a11y")))
)

Zeronode

(after! circe
  (set-irc-server! "irc.zeronode.net"
    `(:tls t
      :port 6697
      :nic "sektor"
      :sasl-username ,(+pass-get-user "irc/zeronode.net")
      :sasl-password (lambda (&rest _) (+pass-get-secret "irc/zeronode.net"))
      :channels ("#noagenda"))))

Email

We need to use the set-email-account! function to configure mu4e to work with our accounts.

(set-email-account! "gmail" '((mu4e-sent-folder . "/gmail/[Gmail]/Sent Mail")
                              (mu4e-drafts-folder . "/gmail/Drafts")
                              (mu4e-trash-folder . "/gmail/Trash")
                              (mu4e-refile-folder . "/gmail/[Gmail]/All Mail")
                              (smtpmail-smtp-user "hunter.t.joz@gmail.com")
                              ))

Sending Messages

I guess it would help if I configured this to actually send with the correct program, namely msmtp, who is configured elsewhere. To get him to work though, we need to do some things Emacs side.

(after! mu4e
  (setq sendmail-program (executable-find "msmtp")
        send-mail-function #'smtpmail-send-it
        message-sendmail-f-is-evil t
        message-sendmail-extra-arguments '("--read-envelope-from")
        message-send-mail-function #'message-send-mail-with-sendmail
  mu4e-headers-full-search t))