Files
dotfiles/emacs/.config/doom/config.el
2020-04-01 16:00:19 -04:00

371 lines
12 KiB
EmacsLisp

(add-to-list 'default-frame-alist '(inhibit-double-buffering . t))
(setq user-full-name "Colin Powell"
user-mail-address "colin@unbl.ink")
(setq doom-font (font-spec :family "FuraCode Nerd Font Mono" :size 12))
(setq doom-big-font (font-spec :family "FuraCode Nerd Font Mono" :size 17))
(setq doom-theme 'srcery)
;; Applies to current frame
(set-frame-parameter nil 'internal-border-width 20) ; applies to the current frame
;; If we create new frames (via emacsclient) this will do the trick
(add-to-list 'default-frame-alist '(internal-border-width . 20))
;; Dash highlighting
(after! dash (dash-enable-font-lock))
;; Dash highlighting
(after! dash (dash-enable-font-lock))
(map! ;; Easier window movement
:n "C-h" 'evil-window-left
:n "C-j" 'evil-window-down
:n "C-k" 'evil-window-up
:n "C-l" 'evil-window-right
(:map evil-treemacs-state-map
"C-h" 'evil-window-left
"C-l" 'evil-window-right)
:leader
(:prefix "f"
:desc "Find file in dotfiles" "t" #'+hlissner/find-in-dotfiles
:desc "Browse dotfiles" "T" #'+hlissner/browse-dotfiles)
(:prefix "t"
:desc "Switch themes" "t" #'load-theme)
(:prefix "o"
:desc "Elfeed feed reader" "f" #'elfeed
:desc "Hckrnews" "h" #'hackernews
:desc "Lobste.rs" "l" #'ivy-lobsters)
(:prefix "b"
:desc "Black format buffer" "f" #'blacken-buffer
:desc "isort buffer" "I" #'py-isort-buffer
:desc "Links in buffer" "l" #'ace-link-org)
(:prefix "s"
:desc "Search project TODOs" "t" #'+ivy/tasks
:desc "Search the web" "w" #'web-search
:desc "Goto URL in eww" "u" #'eww-browse-url
:desc "Search in eww" "3" #'eww-search-words
:desc "Search all the things" "g" #'deadgrep))
(setq wttrin-default-cities '("Castine, ME" "San Francisco" "Thessaloniki"))
(setq wttrin-default-accept-language '("Accept-Language" . "en-US"))
(map!
(:leader
(:prefix "o"
:desc "Weather" "w" #'wttrin)))
;; app/search
(after! web-search
(push '("Searx" "http://search.unbl.ink/?q=%s")
web-search-providers)
(setq web-search-default-provider "Searx"))
;; app/eglot
;; Back to eglot ...
(add-hook 'foo-mode-hook 'eglot-ensure)
(setq libmpdel-hostname "mpd.unbl.ink")
(defun mpdel-playlist-play ()
"Start playing the song at point."
(interactive)
(if (derived-mode-p 'mpdel-playlist-current-playlist-mode)
(libmpdel-play-song (navigel-entity-at-point))
(mpdel-core-insert-current-playlist)))
(map! :leader
(:prefix "-"
:desc "MPD Open playlist" "-" #'mpdel-playlist-open
:desc "MPD Remove at point" "d" #'mpdel-playlist-delete
:desc "MPD Start at point" "s" #'mpdel-playlist-play
:desc "MPD Next track" "n" #'libmpdel-playback-next
:desc "MPD Previous track" "p" #'libmpdel-playback-previous))
;; app/rss
(add-hook! 'elfeed-show-mode-hook (text-scale-set 1.5))
(setq rmh-elfeed-org-files (list "~/org/elfeed.org")
elfeed-search-filter "@1-week-ago +unread ")
(defun elfeed-search-format-date (date)
(format-time-string "%Y-%m-%d %H:%M" (seconds-to-time date)))
(run-with-timer 0 (* 30 60) 'elfeed-update)
(setq httpd-host "0.0.0.0")
(setq httpd-port 10000)
(add-hook 'prog-mode-hook #'goto-address-mode) ;; Linkify links!
;;; It is the opposite of fill-paragraph
(defun unfill-paragraph ()
"Takes a multi-line paragraph and makes it into a single line of text."
(interactive)
(let ((fill-column (point-max)))
(fill-paragraph nil)))
;; Handy key definition
(define-key global-map "\M-z" 'unfill-paragraph)
;; A rainbow cat, why not?
(nyan-mode)
;; Show the cursor when we make jumps, I'm too old for this shit.
(beacon-mode)
;; Emojis, fuck me.
(add-hook 'after-init-hook #'global-emojify-mode)
;; PlantUML is awesome for quick diagrams
(add-to-list 'auto-mode-alist '("\\.plantuml\\'" . plantuml-mode))
;; Timezone location strings at http://worldtime.io
(setq display-time-world-list '(("America/Los_Angeles" "San Francisco")
("America/Tegucigalpa" "Tegucigalpa")
("America/New_York" "New York")
("Europe/London" "London")
("Europe/Warsaw" "Warsaw")
("Europe/Kiev" "Lviv")))
(setq +workspaces-switch-project-function #'ignore
+format-on-save-enabled-modes '(python-mode)
+pretty-code-enabled-modes '(emacs-lisp-mode org-mode))
;; tools/deft
(setq deft-extensions '("org"))
(setq deft-directory "~/org")
(after! org
(setq org-directory (expand-file-name "~/org/")
org-agenda-files (list org-directory)
org-agenda-window-setup 'only-window
org-pretty-entities t
org-log-done 'time
org-fontify-whole-heading-line t
org-fontify-done-headline t
org-fontify-quote-and-verse-blocks t
org-ellipsis ""
org-capture-templates
'(("i" "Send to inbox" entry (file+headline "~/org/inbox.org" "Inbox")
"* TODO %?\n"))
org-todo-keywords
'((sequence "TODO(t)" "NEXT(n)" "MAYBE(m)" "|" "DONE(d)" "WONTDO(w)"))
org-tag-alist '(("@personal" . ?h)
("@farm" . ?f)
("@town" . ?s)
("@errand" . ?e)
("@15five" . ?w)
("@family" . ?m))
org-modules '(ol-eshell
ol-notmuch
ob-eval
ob-exp
ob-http
org-drill
org-id)))
;; Refiling
(setq org-refile-targets '((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9)))
(setq org-outline-path-complete-in-steps nil) ; Refile in a single go
(setq org-refile-use-outline-path t) ; Show full paths for refiling
;; org-set-tags-command
(setq +inbox-file "~/org/inbox.org")
(defun +open-inbox-file ()
(interactive)
"Opens the inbox file"
(find-file +inbox-file))
(map!
:leader
:desc "Open inbox" "I" #'+open-inbox-file
:desc "Open today" "T" #'org-roam-today
:desc "Open tomorrow" "N" #'org-roam-tomorrow)
(map! :leader
(:prefix "f" :desc "Save all org buffers" "a" #'org-save-all-org-buffers))
(setq org-agenda-span 5
org-agenda-start-day "1d")
(defun +show-agenda ()
(interactive)
(delete-other-windows)
(with-popup-rules! nil
(org-agenda-list)
(calendar))
(other-window 1)
(split-window-vertically)
(other-window 1)
(find-file +todo-file))
(use-package! org-roam
:commands (org-roam-insert org-roam-find-file org-roam)
:init
(setq org-roam-directory "~/org/")
(map! :leader
:prefix "n"
:desc "Org-Roam-Insert" "i" #'org-roam-insert
:desc "Org-Roam-Find" "/" #'org-roam-find-file
:desc "Org-Roam-Buffer" "r" #'org-roam)
:config
(org-roam-mode +1))
(with-eval-after-load 'org-roam
(with-eval-after-load 'company
(with-eval-after-load 'org
(require 'company-org-roam)
(company-org-roam-init))))
(require 'justify-kp)
;(setq nov-text-width t)
(setq nov-text-width 80)
(defun my-nov-window-configuration-change-hook ()
(my-nov-post-html-render-hook)
(remove-hook 'window-configuration-change-hook
'my-nov-window-configuration-change-hook
t))
(defun my-nov-post-html-render-hook ()
(if (get-buffer-window)
(let ((max-width (pj-line-width))
buffer-read-only)
(save-excursion
(goto-char (point-min))
(while (not (eobp))
(when (not (looking-at "^[[:space:]]*$"))
(goto-char (line-end-position))
(when (> (shr-pixel-column) max-width)
(goto-char (line-beginning-position))
(pj-justify)))
(forward-line 1))))
(add-hook 'window-configuration-change-hook
'my-nov-window-configuration-change-hook
nil t)))
(add-hook 'nov-post-html-render-hook 'my-nov-post-html-render-hook)
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
(defun my-nov-font-setup ()
(face-remap-add-relative 'variable-pitch :family "Liberation Serif"
:size 20
:height 1.0))
(add-hook 'nov-mode-hook 'my-nov-font-setup)
(load! "+mail") ;; Mail stuff
;; Use word wrap in text emails, because most people suck
(remove-hook 'text-mode-hook #'auto-fill-mode)
(add-hook 'message-mode-hook #'word-wrap-mode)
(after! eshell
(set-eshell-alias!
"f" "(other-window 1) && find-file $1"
"l" "ls -lh"
"d" "dired $1"
"dc" "docker-compose $*"
"fftest" "cd ~/src/ff/fifteen5 && docker-compose exec app django-admin test -k $*"
"ffsh" "cd ~/src/ff/fifteen5/ && docker-compose exec app django-admin shell_plus"
"ffdj" "cd ~/src/ff/fifteen5/ && docker-compose exec app django-admin $*"
"gl" "(call-interactively 'magit-log-current)"
"gs" "magit-status"
"gc" "magit-commit"))
(use-package! ranger
:commands (ranger deer ranger-override-dired-fn)
:config
(set-popup-rule! "^\\*ranger" :ignore t))
(map!
(:leader
(:prefix "a"
:desc "Ranger" "r" #'ranger
:desc "Deer" "d" #'deer)))
(add-hook! dired-mode #'ranger-override-dired-fn) ;; Override dired-mode so it uses deer
(setq mastodon-instance-url "https://mastodon.technology")
(map! :leader
(:prefix "="
:desc "Open mastodon" "=" #'mastodon
:desc "Update Mastodon timeline" "u" #'mastodon-tl--update
:desc "Toot to Mastodon" "t" #'mastodon-toot))
(use-package! slack
:commands (slack-start)
:init
(setq slack-buffer-emojify t)
(setq slack-prefer-current-team t)
:config
(slack-register-team
:name "15five"
:token (auth-source-pick-first-password
:host "15five.slack.com"
:user "colin.powell@15five.com")
:subscribed-channels '(squad-admin water-cooler))
(slack-register-team
:name "RAB"
:token (auth-source-pick-first-password
:host "randomaccessbrewery.slack.com"
:user "colin@onec.me")
:subscribed-channels '(the_taps random))
(evil-define-key 'normal slack-info-mode-map
",u" 'slack-room-update-messages)
(evil-define-key 'normal slack-mode-map
",c" 'slack-buffer-kill
",ra" 'slack-message-add-reaction
",rr" 'slack-message-remove-reaction
",rs" 'slack-message-show-reaction-users
",pl" 'slack-room-pins-list
",pa" 'slack-message-pins-add
",pr" 'slack-message-pins-remove
",mm" 'slack-message-write-another-buffer
",me" 'slack-message-edit
",md" 'slack-message-delete
",u" 'slack-room-update-messages
",2" 'slack-message-embed-mention
",3" 'slack-message-embed-channel
"\C-n" 'slack-buffer-goto-next-message
"\C-p" 'slack-buffer-goto-prev-message)
(evil-define-key 'normal slack-edit-message-mode-map
",k" 'slack-message-cancel-edit
",s" 'slack-message-send-from-buffer
",2" 'slack-message-embed-mention
",3" 'slack-message-embed-channel))
(use-package! alert
:commands (alert)
:init
(setq alert-default-style 'libnotify))
(map! :leader
(:prefix "r"
:desc "Slack channels" "s" #'slack-start
:desc "Slack channels" "c" #'slack-channel-select
:desc "Slack IMs" "i" #'slack-im-select
:desc "Slack groups" "g" #'slack-group-select
:desc "Slack threads" "t" #'slack-all-threads))
(load! "beancount")
(require 'beancount)
(add-to-list 'auto-mode-alist '("\\.beancount\\'" . beancount-mode))
(define-derived-mode
pandoc-view-mode
markdown-mode
"pandoc-view-mode"
"View pandoc processing of docx file using markdown mode."
(erase-buffer)
(let* ((pandoc (executable-find "pandoc")))
(insert (shell-command-to-string
(concat pandoc " --wrap=none " (shell-quote-argument (buffer-file-name)) " -t markdown"))))
(not-modified)
(read-only-mode t))
(add-to-list 'auto-mode-alist '("\\.docx\\'" . pandoc-view-mode))