- [[#header][Header]]
- [[#initial-setup][Initial setup]]
- [[#core][Core]]
+- [[#borg-essentials][Borg's =layer/essentials=]]
+- [[#editing][Editing]]
+- [[#syntax-spell-checking][Syntax and spell checking]]
+- [[#programming-modes][Programming modes]]
+- [[#emacs-enhancements][Emacs enhancements]]
+- [[#email][Email]]
+- [[#blogging][Blogging]]
- [[#post-initialization][Post initialization]]
- [[#footer][Footer]]
(exec-path-from-shell-copy-env "SSH_AUTH_SOCK"))
#+end_src
-** Only one custom theme at a time
+** COMMENT Only one custom theme at a time
#+begin_src emacs-lisp
-;; only one custom theme at a time
-;;
-;; (defadvice load-theme (before clear-previous-themes activate)
-;; "Clear existing theme settings instead of layering them"
-;; (mapc #'disable-theme custom-enabled-themes))
+(defadvice load-theme (before clear-previous-themes activate)
+ "Clear existing theme settings instead of layering them"
+ (mapc #'disable-theme custom-enabled-themes))
#+end_src
** Server
:config (or (server-running-p) (server-mode)))
#+end_src
-** Unicode support
+** COMMENT Unicode support
Font stack with better unicode support, around =Ubuntu Mono= and
=Hack=.
#+begin_src emacs-lisp
-;; unicode support
-;;
-;; (dolist (ft (fontset-list))
-;; (set-fontset-font
-;; ft
-;; 'unicode
-;; (font-spec :name "Source Code Pro" :size 14))
-;; (set-fontset-font
-;; ft
-;; 'unicode
-;; (font-spec :name "DejaVu Sans Mono")
-;; nil
-;; 'append)
-;; ;; (set-fontset-font
-;; ;; ft
-;; ;; 'unicode
-;; ;; (font-spec
-;; ;; :name "Symbola monospacified for DejaVu Sans Mono")
-;; ;; nil
-;; ;; 'append)
-;; ;; (set-fontset-font
-;; ;; ft
-;; ;; #x2115 ; ℕ
-;; ;; (font-spec :name "DejaVu Sans Mono")
-;; ;; nil
-;; ;; 'append)
-;; (set-fontset-font
-;; ft
-;; (cons ?Α ?ω)
-;; (font-spec :name "DejaVu Sans Mono" :size 14)
-;; nil
-;; 'prepend))
+(dolist (ft (fontset-list))
+ (set-fontset-font
+ ft
+ 'unicode
+ (font-spec :name "Source Code Pro" :size 14))
+ (set-fontset-font
+ ft
+ 'unicode
+ (font-spec :name "DejaVu Sans Mono")
+ nil
+ 'append)
+ ;; (set-fontset-font
+ ;; ft
+ ;; 'unicode
+ ;; (font-spec
+ ;; :name "Symbola monospacified for DejaVu Sans Mono")
+ ;; nil
+ ;; 'append)
+ ;; (set-fontset-font
+ ;; ft
+ ;; #x2115 ; ℕ
+ ;; (font-spec :name "DejaVu Sans Mono")
+ ;; nil
+ ;; 'append)
+ (set-fontset-font
+ ft
+ (cons ?Α ?ω)
+ (font-spec :name "DejaVu Sans Mono" :size 14)
+ nil
+ 'prepend))
#+end_src
** Gentler font resizing
*** Don’t display =*compilation*= on success
-From https://stackoverflow.com/a/17788551.
+Based on https://stackoverflow.com/a/17788551, with changes to use
+=cl-letf= instead of the now obsolete =flet=.
#+begin_src emacs-lisp
-(defun amin--compilation-finish-function (buffer outstr)
- (unless (string-match "finished" outstr)
- (switch-to-buffer-other-window buffer))
- t)
-
-(setq compilation-finish-functions #'amin--compilation-finish-function)
+(with-eval-after-load 'compile
+ (defun amin--compilation-finish-function (buffer outstr)
+ (unless (string-match "finished" outstr)
+ (switch-to-buffer-other-window buffer))
+ t)
-(require 'cl)
+ (setq compilation-finish-functions #'amin--compilation-finish-function)
-(defadvice compilation-start
- (around inhibit-display
- (command &optional mode name-function highlight-regexp))
- (if (not (string-match "^\\(find\\|grep\\)" command))
- (flet ((display-buffer)
- (set-window-point)
- (goto-char))
- (fset 'display-buffer 'ignore)
- (fset 'goto-char 'ignore)
- (fset 'set-window-point 'ignore)
- (save-window-excursion
- ad-do-it))
- ad-do-it))
+ (require 'cl-macs)
-(ad-activate 'compilation-start)
+ (defadvice compilation-start
+ (around inhibit-display
+ (command &optional mode name-function highlight-regexp))
+ (if (not (string-match "^\\(find\\|grep\\)" command))
+ (cl-letf (((symbol-function 'display-buffer) #'ignore))
+ (save-window-excursion ad-do-it))
+ ad-do-it))
+ (ad-activate 'compilation-start))
#+end_src
*** Search for non-ASCII characters
;; (setq replace-char-fold t)
#+end_src
+*** Cursor shape
+
+#+begin_src emacs-lisp
+(setq-default cursor-type 'bar)
+#+end_src
+
** Bindings
#+begin_src emacs-lisp
org-edit-src-content-indentation 0
org-email-link-description-format "Email %c: %s" ; %.30s
org-highlight-latex-and-related '(entities)
+ org-use-speed-commands t
+ org-startup-folded 'content
+ org-catch-invisible-edits 'show-and-error
org-log-done 'time)
(add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
(font-lock-add-keywords
(let* ((file-tangle-start-time (current-time))
(file (buffer-file-name))
(file-nodir (file-name-nondirectory file))
- (async-quiet-switch "-q"))
+ ;; (async-quiet-switch "-q")
+ )
(async-start
`(lambda ()
(require 'org)
#+begin_src emacs-lisp
(use-package swiper
- :bind (("C-s" . swiper)
- ("C-r" . swiper)))
+ :bind (("C-s" . swiper)
+ ("C-r" . swiper)
+ ("C-S-s" . isearch-forward)))
#+end_src
**** Counsel
(use-package eshell
:defer 1
:commands eshell
+ :bind ("C-c a s e" . eshell)
:config
(eval-when-compile (defvar eshell-prompt-regexp))
(defun amin/eshell-quit-or-delete-char (arg)
(defun amin|eshell-setup ()
(make-local-variable 'company-idle-delay)
- (setq company-idle-delay nil)
+ (defvar company-idle-delay nil)
(bind-keys :map eshell-mode-map
("C-d" . amin/eshell-quit-or-delete-char)
("C-S-l" . amin/eshell-clear)
'(("default"
("dired" (mode . dired-mode))
("org" (mode . org-mode))
+ ("gnus"
+ (or
+ (mode . gnus-group-mode)
+ (mode . gnus-summary-mode)
+ (mode . gnus-article-mode)
+ ;; not really, but...
+ (mode . message-mode)))
("web"
(or
(mode . web-mode)
("shell"
(or
(mode . eshell-mode)
- (mode . shell-mode)))
- ("notmuch" (name . "\*notmuch\*"))
+ (mode . shell-mode)
+ (mode . term-mode)))
("programming"
(or
(mode . python-mode)
+ (mode . c-mode)
(mode . c++-mode)
- (mode . emacs-lisp-mode)))
+ (mode . emacs-lisp-mode)
+ (mode . scheme-mode)
+ (mode . haskell-mode)
+ (mode . lean-mode)))
("emacs"
(or
(name . "^\\*scratch\\*$")
- (name . "^\\*Messages\\*$")))
- ("slack"
- (or
- (name . "^\\*Slack*"))))))
+ (name . "^\\*Messages\\*$"))))))
(ibuffer-formats
'((mark modified read-only locked " "
(name 18 18 :left :elide)
#+end_src
* Borg's =layer/essentials=
+:PROPERTIES:
+:CUSTOM_ID: borg-essentials
+:END:
TODO: break this giant source block down into individual org sections.
#+end_src
* Editing
+:PROPERTIES:
+:CUSTOM_ID: editing
+:END:
** Company
#+end_src
* Syntax and spell checking
+:PROPERTIES:
+:CUSTOM_ID: syntax-spell-checking
+:END:
#+begin_src emacs-lisp
(use-package flycheck
(advice-add #'ispell-parse-output :filter-args
#'endless/replace-quote))
#+end_src
+
* Programming modes
+:PROPERTIES:
+:CUSTOM_ID: programming-modes
+:END:
** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]])
:hook (web-mode css-mode html-mode sgml-mode))
#+end_src
-** Nix
-
-#+begin_src emacs-lisp
-(use-package nix-mode
- :defer t
- :mode "\\.nix\\'")
-#+end_src
-
-** Java
+** COMMENT Java
*** meghanada
-#+begin_src emacs-lisp :tangle no
+#+begin_src emacs-lisp
(use-package meghanada
:bind
(:map meghanada-mode-map
treemacs
#+end_comment
-#+begin_src emacs-lisp :tangle no
+#+begin_src emacs-lisp
(use-package treemacs
:config (setq treemacs-never-persist t))
:after (treemacs))
#+end_src
-* Emacs Enhancements
+** geiser
+
+#+begin_src emacs-lisp
+(use-package geiser)
+
+(use-package geiser-guile
+ :config
+ (setq geiser-guile-load-path "~/src/git/guix"))
+#+end_src
+
+** guix
+
+#+begin_src emacs-lisp
+(use-package guix
+ :load-path "lib/guix/elisp")
+#+end_src
+
+* Emacs enhancements
+:PROPERTIES:
+:CUSTOM_ID: emacs-enhancements
+:END:
** [[https://github.com/justbur/emacs-which-key][which-key]]
(load-theme 'tangomod t)
#+end_src
-** doom-modeline
+** smart-mode-line
#+begin_src emacs-lisp
-(use-package doom-modeline
- :demand t
- :config (setq doom-modeline-height 32)
- :hook (after-init . doom-modeline-init))
+(use-package smart-mode-line
+ :config
+ (sml/setup))
#+end_src
** doom-themes
(defun amin/lights-on ()
"Enable my favourite light theme."
(interactive)
- (progn
- (mapc #'disable-theme custom-enabled-themes)
- (load-theme 'tangomod t)))
+ (mapc #'disable-theme custom-enabled-themes)
+ (load-theme 'tangomod t)
+ (sml/apply-theme 'automatic))
(defun amin/lights-off ()
"Go dark."
(interactive)
- (progn
- (mapc #'disable-theme custom-enabled-themes)
- (load-theme 'doom-tomorrow-night t)))
+ (mapc #'disable-theme custom-enabled-themes)
+ (load-theme 'doom-tomorrow-night t)
+ (sml/apply-theme 'automatic))
(bind-keys
("s-t d" . amin/lights-off)
(advice-add 'magit-checkout
:after #'my-projectile-invalidate-cache)
(advice-add 'magit-branch-and-checkout
- :after #'my-projectile-invalidate-cache))))
+ :after #'my-projectile-invalidate-cache)))
+ :custom (projectile-completion-system 'ivy))
#+end_src
** [[https://github.com/Wilfred/helpful][helpful]]
("C-S-h p" . helpful-at-point)))
#+end_src
-** [[https://github.com/knu/shell-toggle.el][shell-toggle]]
-
-#+begin_src emacs-lisp
-(use-package shell-toggle
- :after eshell
- :bind ("C-c a s e" . amin/shell-toggle)
- :config
- (defun amin/shell-toggle (make-cd)
- "Toggle between the shell buffer and whatever buffer you are editing.
-With a prefix argument MAKE-CD also insert a \"cd DIR\" command
-into the shell, where DIR is the directory of the current buffer.
-
-When called in the shell buffer returns you to the buffer you were editing
-before calling this the first time.
-
-Options: `shell-toggle-goto-eob'"
- (interactive "P")
- ;; Try to decide on one of three possibilities:
- ;; If not in shell-buffer, switch to it.
- ;; If in shell-buffer, return to state before going to the shell-buffer
- (if (eq (current-buffer) shell-toggle-shell-buffer)
- (shell-toggle-buffer-return-from-shell)
- (progn
- (shell-toggle-buffer-goto-shell make-cd)
- (if shell-toggle-full-screen-window-only (delete-other-windows)))))
-
- ;; override to split horizontally instead
- (defun shell-toggle-buffer-switch-to-other-window ()
- "Switch to other window.
-If the current window is the only window in the current frame,
-create a new window and switch to it.
-
-\(This is less intrusive to the current window configuration than
-`switch-buffer-other-window')"
- (let ((this-window (selected-window)))
- (other-window 1)
- ;; If we did not switch window then we only have one window and need to
- ;; create a new one.
- (if (eq this-window (selected-window))
- (progn
- (split-window-horizontally)
- (other-window 1)))))
-
- :custom
- (shell-toggle-launch-shell 'shell-toggle-eshell))
-#+end_src
-
** [[https://github.com/EricCrosson/unkillable-scratch][unkillable-scratch]]
Make =*scratch*= and =*Messages*= unkillable.
Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
-** [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]]
-
-#+begin_src emacs-lisp
-(use-package highlight-indent-guides
- :disabled t
- :defer 3
- :hook ((prog-mode . highlight-indent-guides-mode)
- ;; (org-mode . highlight-indent-guides-mode)
- )
- :config
- (setq highlight-indent-guides-character ?\|)
- (setq highlight-indent-guides-auto-enabled nil)
- (setq highlight-indent-guides-method 'character)
- (setq highlight-indent-guides-responsive 'top)
- (set-face-foreground 'highlight-indent-guides-character-face "gainsboro")
- (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
- :defer t
- :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
""))))
#+end_src
-** slack
-
-Hopefully temporary.
-
-#+begin_src emacs-lisp
-(use-package slack
- :disabled t
- :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)
- (add-to-list 'swiper-font-lock-exclude 'slack-message-buffer-mode t)
- (setq lui-time-stamp-format "[%Y-%m-%d %H:%M:%S]"
- lui-time-stamp-only-when-changed-p t
- lui-time-stamp-position 'right)
- :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
- ("M-p" . slack-buffer-goto-prev-message)
- ("M-n" . slack-buffer-goto-next-message)
- ("C-c e" . slack-message-edit)
- ("C-c k" . slack-message-delete)
- ("C-c C-k" . slack-channel-leave)
- ("C-c r a" . slack-message-add-reaction)
- ("C-c r r" . slack-message-remove-reaction)
- ("C-c r s" . slack-message-show-reaction-users)
- ("C-c p l" . slack-room-pins-list)
- ("C-c p a" . slack-message-pins-add)
- ("C-c p r" . slack-message-pins-remove)
- ("@" . slack-message-embed-mention)
- ("#" . slack-message-embed-channel)))
-
-(use-package alert
- :commands (alert)
- :init
- (setq alert-default-style 'notifier))
-#+end_src
-
** [[https://github.com/peterwvj/eshell-up][eshell-up]]
#+begin_src emacs-lisp
#+begin_src emacs-lisp
(use-package multi-term
:defer 1
- :bind (("C-c C-j" . term-line-mode)
- ("C-c a s m m" . multi-term)
- ("C-c a s m p" . multi-term-dedicated-toggle))
+ :bind (("C-c a s m m" . multi-term)
+ ("C-c a s m p" . multi-term-dedicated-toggle)
+ :map term-mode-map
+ ("C-c C-j" . term-char-mode)
+ :map term-raw-map
+ ("C-c C-j" . term-line-mode))
:config
(setq multi-term-program "/bin/screen"
;; TODO: add separate bindings for connecting to existing
(global-page-break-lines-mode))
#+end_src
+** expand-region
+
+#+begin_src emacs-lisp
+(use-package expand-region
+ :bind ("C-=" . er/expand-region))
+#+end_src
+
* Email
+:PROPERTIES:
+:CUSTOM_ID: email
+:END:
#+begin_src emacs-lisp
(defvar amin-maildir (expand-file-name "~/mail/"))
read-mail-command 'gnus)
(use-package gnus
- :bind (("s-m" . gnus)
- ("s-M" . gnus-unplugged))
+ :bind (("C-c m" . gnus)
+ ("C-c M" . gnus-unplugged)
+ ("s-m" . gnus)
+ ("s-M" . gnus-unplugged))
:init
(setq
gnus-select-method '(nnnil "")
footnote-style 'unicode))
#+end_src
-** bbdb
+** ebdb
-Manually install bbdb (=lisp/bbdb= copied from an ELPA-based setup),
-because installing it from source on Emacs 27 using the following
-submodule configuration for some reason doesn’t work and results in
-very strange errors when using any of the functions.
+#+begin_src emacs-lisp
+(use-package ebdb
+ :defer 1
+ :bind (:map gnus-group-mode-map ("e" . ebdb))
+ :config
+ (setq ebdb-sources (no-littering-expand-var-file-name "ebdb"))
+ (after! swiper
+ (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
-#+begin_src conf :tangle no
-[submodule "bbdb"]
- path = lib/bbdb
- url = https://git.savannah.nongnu.org/git/bbdb.git
- load-path = lisp
- info-path = doc
- build-step = ./autogen.sh
- build-step = ./configure
- build-step = make
- build-step = make install
-#+end_src
+(use-package ebdb-com
+ :after ebdb)
-I tried using =borg-elpa= instead of doing it like this, but it added
-2 seconds to my startup time, which is unacceptable to me.
+;; (use-package ebdb-complete
+;; :after ebdb
+;; :config
+;; (ebdb-complete-enable))
-#+begin_src emacs-lisp
-(use-package bbdb
- :load-path "lisp/bbdb"
- :init
- (load (expand-file-name "lisp/bbdb/bbdb-autoloads.el" user-emacs-directory))
- ;; (bbdb-mua-auto-update-init 'message)
- (setq bbdb-mua-auto-update-p 'query
- bbdb-complete-mail nil)
- (bbdb-initialize 'gnus 'message))
+(use-package company-ebdb
+ :after (:all company message)
+ :config
+ (defun company-ebdb--post-complete (_) nil)
+ :hook
+ (message-mode . (lambda ()
+ (add-to-list (make-local-variable 'company-backends)
+ 'company-ebdb))))
+
+(use-package ebdb-gnus
+ :after ebdb
+ :custom
+ (ebdb-gnus-window-configuration
+ '(article
+ (vertical 1.0
+ (summary 0.25 point)
+ (horizontal 1.0
+ (article 1.0)
+ (ebdb-gnus 0.3))))))
+
+(use-package ebdb-mua
+ :after ebdb
+ ;; :custom (ebdb-mua-pop-up nil)
+ )
+
+;; (use-package ebdb-message
+;; :after ebdb)
+
+
+;; (use-package ebdb-vcard
+;; :after ebdb)
#+end_src
-** message-x
+** COMMENT message-x
#+begin_src emacs-lisp
(use-package message-x
- :disabled t
:custom
(message-x-completion-alist
(quote
. message-expand-group)))))
#+end_src
-** gnus-harvest
+** COMMENT gnus-harvest
#+begin_src emacs-lisp
(use-package gnus-harvest
- :disabled t
:commands gnus-harvest-install
:demand t
:config
#+end_src
* Blogging
+:PROPERTIES:
+:CUSTOM_ID: blogging
+:END:
** [[https://ox-hugo.scripter.co][ox-hugo]]
* COMMENT Local Variables :ARCHIVE:
# Local Variables:
# eval: (add-hook 'after-save-hook #'amin/async-babel-tangle 'append 'local)
+# eval: (typo-mode -1)
# End: