`(after! (:all ,@features) ,@body)))))
#+end_src
+Convenience macro for =setq='ing multiple variables to the same value:
+
+#+begin_src emacs-lisp
+(defmacro setq-every! (value &rest vars)
+ "Set all the variables from VARS to value VALUE."
+ (declare (indent defun) (debug t))
+ `(progn ,@(mapcar (lambda (x) (list 'setq x value)) vars)))
+#+end_src
+
* Core
:PROPERTIES:
:CUSTOM_ID: core
:bind (:map haskell-mode-map
("C-c l l" . hs-lint)))
#+end_src
+
+** Web dev
+
+*** SGML and HTML
+
+#+begin_src emacs-lisp
+(use-package sgml-mode
+ :config
+ (setq sgml-basic-offset 2))
+#+end_src
+
+*** CSS and SCSS
+
+#+begin_src emacs-lisp
+(use-package css-mode
+ :config
+ (setq css-indent-offset 2))
+#+end_src
+
+*** Web mode
+
+#+begin_src emacs-lisp
+(use-package web-mode
+ :mode "\\.html\\'"
+ :config
+ (setq-every! 2
+ web-mode-code-indent-offset
+ web-mode-css-indent-offset
+ web-mode-markup-indent-offset))
+#+end_src
+
+*** Emmet mode
+
+#+begin_src emacs-lisp
+(use-package emmet-mode
+ :bind* (("C-)" . emmet-next-edit-point)
+ ("C-(" . emmet-prev-edit-point))
+ :init
+ (setq emmet-move-cursor-between-quotes t)
+ :hook (web-mode css-mode html-mode sgml-mode))
+#+end_src
+
* Emacs Enhancements
** [[https://github.com/justbur/emacs-which-key][which-key]]
:after #'my-projectile-invalidate-cache))))
#+end_src
-** [[https://github.com/wasamasa/shackle][shackle]]
-
-#+begin_src emacs-lisp
-(use-package shackle
- :demand t
- :commands shackle-mode
- :config
- (shackle-mode 1)
- (setq shackle-rules
- '(("*Help*" :align right :select t :size 0.5)
- ("\\`\\*helm.*?\\*\\'" :regexp t :align t)
- ((compilation-mode "\\`\\*magit-diff: .*?\\'") :regexp t :noselect t)
- ("*magit-dispatch-popup*" :align bottom)
- ((inferior-scheme-mode "*shell*" "*eshell*") :popup t))
- shackle-default-rule '(:select t)
- shackle-default-size 0.4
- shackle-inhibit-window-quit-on-same-windows t))
-#+end_src
-
** [[https://github.com/Wilfred/helpful][helpful]]
#+begin_src emacs-lisp
#+begin_src emacs-lisp
(use-package shell-pop
- :config
- (add-to-list 'shackle-rules '("\\*eshell\\*" :regexp t :same t))
:custom
(shell-pop-universal-key "C-c e")
(shell-pop-shell-type '("eshell" "*eshell*" (lambda nil (eshell)))))
(unkillable-buffers '("^\\*scratch\\*$" "^\\*Messages\\*$")))
#+end_src
+** [[https://github.com/davep/boxquote.el][boxquote.el]]
+
+#+begin_example
+,----
+| make pretty boxed quotes like this
+`----
+#+end_example
+
+#+begin_src emacs-lisp
+(use-package boxquote
+ :bind
+ (:prefix-map amin--boxquote-prefix-map
+ :prefix "C-c q"
+ ("b" . boxquote-buffer)
+ ("B" . boxquote-insert-buffer)
+ ("d" . boxquote-defun)
+ ("F" . boxquote-insert-file)
+ ("hf" . boxquote-describe-function)
+ ("hk" . boxquote-describe-key)
+ ("hv" . boxquote-describe-variable)
+ ("hw" . boxquote-where-is)
+ ("k" . boxquote-kill)
+ ("p" . boxquote-paragraph)
+ ("q" . boxquote-boxquote)
+ ("r" . boxquote-region)
+ ("s" . boxquote-shell-command)
+ ("t" . boxquote-text)
+ ("T" . boxquote-title)
+ ("u" . boxquote-unbox)
+ ("U" . boxquote-unbox-region)
+ ("y" . boxquote-yank)
+ ("M-q" . boxquote-fill-paragraph)
+ ("M-w" . boxquote-kill-ring-save)))
+#+end_src
+
+Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
+
* Email
** [[https://notmuchmail.org][notmuch]]