+(use-package orgalist
+ :after message
+ :hook (message-mode . orgalist-mode))
+#+end_src
+
+** typo.el
+
+#+begin_src emacs-lisp
+(use-package typo
+ :defer 0.5
+ :config
+ (typo-global-mode 1)
+ :hook (text-mode . typo-mode))
+#+end_src
+
+** hl-todo
+
+#+begin_src emacs-lisp
+(use-package hl-todo
+ :defer 0.5
+ :config
+ (global-hl-todo-mode))
+#+end_src
+
+** shrink-path
+
+#+begin_src emacs-lisp
+(use-package shrink-path
+ :defer 0.5
+ :after eshell
+ :config
+ (defun +eshell/prompt ()
+ (let ((base/dir (shrink-path-prompt default-directory)))
+ (concat (propertize (car base/dir)
+ 'face 'font-lock-comment-face)
+ (propertize (cdr base/dir)
+ 'face 'font-lock-constant-face)
+ (propertize (+eshell--current-git-branch)
+ 'face 'font-lock-function-name-face)
+ "\n"
+ ;; "λ"
+ ;; (propertize "λ" 'face 'eshell-prompt)
+ ;; needed for the input text to not have prompt face
+ (propertize "λ " 'face 'default))))
+
+ (defun +eshell--current-git-branch ()
+ (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n")
+ when (string-match "^\*" match)
+ collect match))))
+ (if (not (eq branch nil))
+ (concat " " (substring branch 2))
+ "")))
+ (setq eshell-prompt-regexp "\\(.*\n\\)*λ "
+ eshell-prompt-function #'+eshell/prompt))
+#+end_src
+
+** [[https://github.com/peterwvj/eshell-up][eshell-up]]
+
+#+begin_src emacs-lisp
+(use-package eshell-up
+ :after eshell
+ :commands eshell-up)
+#+end_src
+
+** multi-term
+
+#+begin_src emacs-lisp
+(use-package multi-term
+ :defer 0.6
+ :bind (("C-c a s m" . 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
+ ;; session vs. always creating a new one
+ multi-term-dedicated-select-after-open-p t
+ multi-term-dedicated-window-height 20
+ multi-term-dedicated-max-window-height 30
+ term-bind-key-alist
+ '(("C-c C-c" . term-interrupt-subjob)
+ ("C-c C-e" . term-send-esc)
+ ("C-k" . kill-line)
+ ("C-y" . term-paste)
+ ("M-f" . term-send-forward-word)
+ ("M-b" . term-send-backward-word)
+ ("M-p" . term-send-up)
+ ("M-n" . term-send-down)
+ ("<C-backspace>" . term-send-backward-kill-word)
+ ("<M-DEL>" . term-send-backward-kill-word)
+ ("M-d" . term-send-delete-word)
+ ("M-," . term-send-raw)
+ ("M-." . comint-dynamic-complete))
+ term-unbind-key-alist
+ '("C-z" "C-x" "C-c" "C-h" "C-y" "<ESC>")))
+#+end_src
+
+** page-break-lines
+
+#+begin_src emacs-lisp
+(use-package page-break-lines
+ :config
+ (global-page-break-lines-mode))
+#+end_src
+
+** expand-region
+
+#+begin_src emacs-lisp
+(use-package expand-region
+ :bind ("C-=" . er/expand-region))
+#+end_src
+
+** multiple-cursors
+
+#+begin_src emacs-lisp
+(use-package multiple-cursors
+ :bind
+ (("C-S-<mouse-1>" . mc/add-cursor-on-click)
+ (:prefix-map a/mc-prefix-map
+ :prefix "C-c m"
+ ("c" . mc/edit-lines)
+ ("n" . mc/mark-next-like-this)
+ ("p" . mc/mark-previous-like-this)
+ ("a" . mc/mark-all-like-this))))
+#+end_src
+
+** forge
+
+#+begin_src emacs-lisp
+(use-package forge
+ :after magit
+ :demand)
+#+end_src
+
+** yasnippet
+
+#+begin_src emacs-lisp
+(use-package yasnippet
+ :defer 0.6