(require 'borg)
(borg-initialize)
-(require 'borg-nix-shell)
-(setq borg-build-shell-command 'borg-nix-shell-build-command)
+;; (require 'borg-nix-shell)
+;; (setq borg-build-shell-command 'borg-nix-shell-build-command)
(with-eval-after-load 'bind-key
(bind-keys
(setf custom-safe-themes t))
#+end_src
+** Secrets file
+
+#+begin_src emacs-lisp
+(load (no-littering-expand-etc-file-name "secrets"))
+#+end_src
+
** Better =$PATH= handling
Let's use [[https://github.com/purcell/exec-path-from-shell][exec-path-from-shell]] to make Emacs use the =$PATH= as set up
Font stack with better unicode support, around =Ubuntu Mono= and
=Hack=.
-#+begin_src emacs-lisp
+#+begin_src emacs-lisp :tangle no
(dolist (ft (fontset-list))
(set-fontset-font
ft
'unicode
- (font-spec :name "Ubuntu Mono"))
+ (font-spec :name "Source Code Pro" :size 14))
(set-fontset-font
ft
'unicode
#+begin_src emacs-lisp
(bind-keys
("C-c b k" . kill-this-buffer)
- ("C-c s s" . save-buffer)
+ ;; ("C-c s s" . save-buffer)
("C-c b s" . save-buffer)
("C-c S" . save-buffer)
("C-c o" . other-window)
- ("C-c q q" . save-buffers-kill-terminal))
+ ("C-c q q" . save-buffers-kill-terminal)
+ ("C-c F m" . make-frame-command)
+ ("C-c F d" . delete-frame)
+ ("C-c F D" . delete-other-frames))
#+end_src
** Packages
org-src-preserve-indentation nil
org-edit-src-content-indentation 0
org-log-done 'time)
- :hook (org-mode . org-indent-mode))
+ :hook ((org-mode . org-indent-mode)
+ (org-mode . auto-fill-mode)
+ (org-mode . flyspell-mode))
+ :custom
+ (org-latex-packages-alist '(("" "listings") ("" "color"))))
+
+(use-package ox-latex
+ :config
+ (setq org-latex-listings 'listings)
+ (add-to-list 'org-latex-packages-alist '("" "listings"))
+ (add-to-list 'org-latex-packages-alist '("" "color"))
+ (add-to-list 'org-latex-classes
+ '("IEEEtran" "\\documentclass[11pt]{IEEEtran}"
+ ("\\section{%s}" . "\\section*{%s}")
+ ("\\subsection{%s}" . "\\subsection*{%s}")
+ ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+ ("\\paragraph{%s}" . "\\paragraph*{%s}")
+ ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
+ t))
+
+(use-package ox-beamer)
(use-package org-notmuch
:after (:any org notmuch))
-(use-package orgalist)
+(use-package orgalist
+ :hook (message-mode . orgalist-mode))
+
+;; (use-package org-outline-numbering)
+;; TODO: auto-updating by calling org-outline-numbering-display
#+end_src
**** asynchronous tangle
("SPC" . magit-status)
("s" . magit-status)
("S" . magit-status-prefix)
- ("B" . magit-blame)
+ ("B" . magit-blame-addition)
("C" . magit-clone)
- ("f" . magit-fetch)
- ("F" . magit-pull)
- ("P" . magit-push)
+ ("f" . magit-fetch-other)
+ ("F" . magit-pull-branch)
+ ("P" . magit-push-other)
("p" . magit-dispatch-popup)
- ("c c" . magit-commit)
+ ("c c" . magit-commit-create)
("c a" . magit-commit-amend)
("b b" . magit-checkout)
- ("b c" . magit-branch))
+ ("b c" . magit-branch-create))
:config
(magit-add-section-hook 'magit-status-sections-hook
'magit-insert-modules
'magit-insert-stashes
- 'append))
+ 'append)
+ :custom-face (magit-diff-file-heading ((t (:weight normal)))))
#+end_src
*** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
("DEL" . ivy-backward-delete-char))
:config
(setq ivy-wrap t)
- (ivy-mode 1))
+ (ivy-mode 1)
+ :custom-face
+ (ivy-minibuffer-match-face-2 ((t (:background "#e99ce8" :weight semi-bold))))
+ (ivy-minibuffer-match-face-3 ((t (:background "#bbbbff" :weight semi-bold))))
+ (ivy-minibuffer-match-face-4 ((t (:background "#ffbbff" :weight semi-bold)))))
#+end_src
**** Swiper
#+begin_src emacs-lisp
(use-package swiper
- :bind (([remap isearch-forward] . swiper)
- ([remap isearch-backward] . swiper)))
+ :bind (("C-s" . swiper)
+ ("C-r" . swiper)))
#+end_src
**** Counsel
(ibuffer-saved-filter-groups
'(("default"
("dired" (mode . dired-mode))
- ("org" (name . "^.*org$"))
+ ("org" (mode . org-mode))
("web"
(or
(mode . web-mode)
:hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
#+end_src
+*** Outline
+
+#+begin_src emacs-lisp
+(use-package outline
+ :hook (prog-mode . outline-minor-mode)
+ :bind
+ (:map
+ outline-minor-mode-map
+ ("<s-tab>" . outline-toggle-children)
+ ("s-p" . outline-previous-visible-heading)
+ ("s-n" . outline-next-visible-heading)
+ :prefix-map amin--outline-prefix-map
+ :prefix "s-o"
+ ("TAB" . outline-toggle-children)
+ ("a" . outline-hide-body)
+ ("H" . outline-hide-body)
+ ("S" . outline-show-all)
+ ("h" . outline-hide-subtree)
+ ("s" . outline-show-subtree)))
+#+end_src
+
* Borg's =layer/essentials=
TODO: break this giant source block down into individual org sections.
:defer 5
:bind
(:map company-active-map
- ([tab] . company-complete-common-or-cycle))
+ ([tab] . company-complete-common-or-cycle)
+ ([escape] . company-abort))
:custom
(company-idle-delay 0.3)
(company-minimum-prefix-length 1)
;; Only flycheck when I actually save the buffer
(setq flycheck-check-syntax-automatically '(mode-enabled save)))
+
+;; http://endlessparentheses.com/ispell-and-apostrophes.html
+(use-package ispell
+ :config
+ ;; ’ can be part of a word
+ (setq ispell-local-dictionary-alist
+ `((nil "[[:alpha:]]" "[^[:alpha:]]"
+ "['\x2019]" nil ("-B") nil utf-8)))
+ ;; don't send ’ to the subprocess
+ (defun endless/replace-apostrophe (args)
+ (cons (replace-regexp-in-string
+ "’" "'" (car args))
+ (cdr args)))
+ (advice-add #'ispell-send-string :filter-args
+ #'endless/replace-apostrophe)
+
+ ;; convert ' back to ’ from the subprocess
+ (defun endless/replace-quote (args)
+ (if (not (derived-mode-p 'org-mode))
+ args
+ (cons (replace-regexp-in-string
+ "'" "’" (car args))
+ (cdr args))))
+ (advice-add #'ispell-parse-output :filter-args
+ #'endless/replace-quote))
#+end_src
* Programming modes
#+begin_src emacs-lisp
(eval-when-compile (defvar lean-mode-map))
(use-package lean-mode
+ :defer 2
:bind (:map lean-mode-map
- ("S-SPC" . company-complete)))
-#+end_src
+ ("S-SPC" . company-complete))
+ :config
+ (require 'lean-input)
+ (setq default-input-method "Lean"))
+ #+end_src
** Haskell
:mode "\\.nix\\'")
#+end_src
+** Java
+
+*** meghanada
+
+#+begin_src emacs-lisp :tangle yes
+(use-package meghanada
+ :bind
+ (:map meghanada-mode-map
+ (("C-M-o" . meghanada-optimize-import)
+ ("C-M-t" . meghanada-import-all)))
+ :hook (java-mode . meghanada-mode))
+#+end_src
+
+*** lsp-java
+
+#+begin_src emacs-lisp :tangle no
+(use-package treemacs)
+
+(use-package yasnippet
+ :config
+ ;; (yas-global-mode)
+ )
+
+(use-package lsp-mode
+ :init (setq lsp-eldoc-render-all nil
+ lsp-highlight-symbol-at-point nil)
+ )
+
+(use-package hydra)
+
+(use-package company-lsp
+ :after company
+ :config
+ (setq company-lsp-cache-candidates t
+ company-lsp-async t))
+
+(use-package lsp-ui
+ :config
+ (setq lsp-ui-sideline-update-mode 'point))
+
+(use-package lsp-java
+ :config
+ (add-hook 'java-mode-hook
+ (lambda ()
+ (setq-local company-backends (list 'company-lsp))))
+
+ (add-hook 'java-mode-hook 'lsp-java-enable)
+ (add-hook 'java-mode-hook 'flycheck-mode)
+ (add-hook 'java-mode-hook 'company-mode)
+ (add-hook 'java-mode-hook 'lsp-ui-mode))
+
+(use-package dap-mode
+ :after lsp-mode
+ :config
+ (dap-mode t)
+ (dap-ui-mode t))
+
+(use-package dap-java
+ :after (lsp-java))
+
+(use-package lsp-java-treemacs
+ :after (treemacs))
+#+end_src
+
* Emacs Enhancements
** [[https://github.com/justbur/emacs-which-key][which-key]]
:hook (after-init . doom-modeline-init))
#+end_src
-** [[https://github.com/11111000000/tao-theme-emacs][tao-theme]]
-
-#+begin_src emacs-lisp :tangle no
-(use-package tao-theme
- :demand t
- :config (load-theme 'tao-yang t))
-#+end_src
-
** [[https://github.com/maio/eink-emacs][eink-theme]]
#+begin_src emacs-lisp
+(setq doom-modeline-bar-width 5)
(load-theme 'eink t)
#+end_src
(use-package highlight-indent-guides
:demand t
:hook ((prog-mode . highlight-indent-guides-mode)
- (org-mode . highlight-indent-guides-mode))
+ ;; (org-mode . highlight-indent-guides-mode)
+ )
:config
(setq highlight-indent-guides-character ?\|)
(setq highlight-indent-guides-auto-enabled nil)
(set-face-foreground 'highlight-indent-guides-top-character-face "grey40")) ; grey13 is nice too
#+end_src
+** pdf-tools
+
+#+begin_src emacs-lisp
+(use-package pdf-tools
+ :magic ("%PDF" . pdf-view-mode)
+ :config
+ (setq pdf-view-resize-factor 1.05)
+ (pdf-tools-install)
+ :bind
+ (:map pdf-view-mode-map
+ ("C-s" . isearch-forward)
+ ("C-r" . isearch-backward)
+ ("j" . pdf-view-next-line-or-next-page)
+ ("k" . pdf-view-previous-line-or-previous-page)
+ ("h" . image-backward-hscroll)
+ ("l" . image-forward-hscroll)))
+#+end_src
+
+** anzu
+
+#+begin_src emacs-lisp
+(use-package anzu)
+#+end_src
+
+** typo.el
+
+#+begin_src emacs-lisp
+(use-package typo
+ :config
+ (typo-global-mode 1)
+ :hook (text-mode . typo-mode))
+#+end_src
+
+** slack
+
+Hopefully temporary.
+
+#+begin_src emacs-lisp
+(use-package slack
+ :commands (slack-start)
+ :init
+ (eval-when-compile ; silence the byte-compiler
+ (defvar url-http-data nil)
+ (defvar url-http-extra-headers nil)
+ (defvar url-http-method nil)
+ (defvar url-callback-function nil)
+ (defvar url-callback-arguments nil)
+ (defvar oauth--token-data nil))
+ (setq slack-buffer-emojify t
+ slack-prefer-current-team t)
+ :config
+ (slack-register-team
+ :name "uw-apv"
+ :default t
+ :client-id uw-apv-client-id
+ :client-secret uw-apv-client-secret
+ :token uw-apv-token
+ :subscribed-channels '(general)
+ :full-and-display-names t)
+ (slack-register-team
+ :name "watform"
+ :default nil
+ :client-id watform-client-id
+ :client-secret watform-client-secret
+ :token watform-token
+ :subscribed-channels '(general)
+ :full-and-display-names t);
+ :bind
+ (("C-c s s" . slack-start)
+ ("C-c s u" . slack-select-unread-rooms)
+ ("C-c s b" . slack-select-rooms)
+ ("C-c s t" . slack-change-current-team)
+ ("C-c s c" . slack-ws-close)
+ :map slack-mode-map
+ ("C-c e" . slack-message-edit)
+ ("C-c k" . slack-message-delete)
+ ("C-c C-k" . slack-channel-leave)
+ ("@" . slack-message-embed-mention)
+ ("#" . slack-message-embed-channel)));
+
+(use-package alert
+ :commands (alert)
+ :init
+ (setq alert-default-style 'notifier))
+#+end_src
+
* Email
#+begin_src emacs-lisp
message-sendmail-envelope-from 'header
;; message-directory "drafts"
message-user-fqdn "aminb.org")
+ ;; (add-hook 'message-mode-hook 'electric-quote-local-mode)
(add-hook 'message-mode-hook
(lambda () (setq fill-column 65
message-fill-column 65)))
#'flyspell-mode)
;; (add-hook 'message-setup-hook
;; #'mml-secure-message-sign-pgpmime)
- )
+ :custom-face
+ (message-header-subject ((t (:foreground "navy blue" :weight semi-bold))))
+ (message-header-to ((t (:foreground "MidnightBlue" :weight semi-bold)))))
(after! mml-sec
(setq mml-secure-openpgp-encrypt-to-self t
#+begin_src emacs-lisp
(defun amin/notmuch ()
"Delete other windows, then launch `notmuch'."
- (interactive)
- (delete-other-windows)
+ (interactive
+ (when (equal current-prefix-arg nil)
+ (delete-other-windows)))
(notmuch))
(use-package notmuch
notmuch-hello-thousands-separator ","
notmuch-fcc-dirs
'(("amin@aminb.org" . "amin/Sent")
- ("amin@gnu.org" . "gnu/Sent")
+ ("bandali@gnu.org" . "gnu/Sent")
("abandali@uwaterloo.ca" . "\"uwaterloo/Sent Items\"")
("mab@gnu.org" . "gnu/Sent")
+ ("amin@gnu.org" . "gnu/Sent")
("aminb@gnu.org" . "gnu/Sent")
(".*" . "sent"))
notmuch-search-result-format
;; (set! :evil-state 'notmuch-message-mode 'insert)
;; (advice-add #'notmuch-bury-or-kill-this-buffer
;; :override #'kill-this-buffer)
+ :hook (notmuch-message-mode . doom-modeline-set-special-modeline)
:bind
(:map notmuch-hello-mode-map
("u" . (lambda ()
"Mark message as spam"
(interactive)
(notmuch-tree-tag '("-unread" "-inbox" "-webmasters" "+spam"))
- (notmuch-tree-next-message)))))
+ (notmuch-tree-next-message))))
+ :custom-face
+ (notmuch-search-unread-face ((t (:weight semi-bold))))
+ (notmuch-tag-face ((t (:foreground "navy blue" :weight semi-bold)))))
(use-package counsel-notmuch
:bind ("C-c s m" . counsel-notmuch))