   :bind
   ("C-c n n" . #'org-noter))
 
-;;;; Media viewing
-
-;; enhanced pdf viewing
-(use-package pdf-tools
-  :straight t
-  :config
-  (setenv "PKG_CONFIG_PATH"
-          "/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig")
-  (setenv "PATH"
-          (s-join ":" exec-path))
-  (pdf-tools-install)
-  (setq-default pdf-view-display-size 'fit-width)
-  :custom
-  (pdf-annot-activate-created-annotations t "automatically annotate highlights"))
-
-;; HTML browser
-(use-package eww
-  :defer t
-  :bind ("C-c o w" . #'eww)
-  :commands (eww))
+;;;;; Code
+
+;; settings for editing c
+(use-package cc-mode
+  :defer t
+  :config
+  (setq c-default-style '((java-mode . "java")
+                          (awk-mode . "awk")
+                          (other . "linux")))
+  (setq-default c-basic-offset 4))
+
+;; edit .yml files
+(use-package yaml-mode
+  :straight t
+  :defer t)
+
+;;;; External Processes
+
+(setq read-process-output-max (* 1024 1024)) ;; 1mb
+
+;; help emacs find executables
+(dolist (path '("/Library/TeX/texbin/" "/usr/local/bin"))
+  (add-to-list path 'exec-path))
+
+
+;;;; Code
+
+;; error checking
+(use-package flycheck
+  :straight t
+  :defer t
+  :hook (prog-mode . flycheck-mode))
+
+;; xref-backend that supports many languages
+(use-package dumb-jump
+  :straight t
+  :commands t/maybe-lsp)
+
+;;;;; Format
+
+;; automatic formatting of program buffers on save
+(use-package format-all
+  :straight t
+  :commands format-all-mode
+  :defer t)
+
+;; format python buffers with black
+(use-package blacken
+  :straight t
+  :defer t
+  :hook (python-mode . blacken-mode))
+
+;; clang-format
+(use-package clang-format
+  :straight t
+  :defer t
+  :commands (clang-format-buffer))
+
+;;;;; LSP
+
+;; IDE-like features through language servers
+(use-package lsp-mode
+  :straight t
+  :defer t
+  :commands lsp lsp-deferred
+  :init
+  (setq lsp-headerline-breadcrumb-enable nil)
+  (setq lsp-keymap-prefix "C-c c")
+  (setq lsp-clients-clangd-args '("-j=3"
+                                  "--background-index"
+                                  "--clang-tidy"
+                                  "--completion-style=detailed"
+                                  "--header-insertion=never"
+                                  "--header-insertion-decorators=0"))
+  (defvar t/lsp-enabled-modes
+    '(python-mode c++-mode js-mode)
+    "List of major modes which LSP should activate on start.")
+  (defun t/maybe-lsp ()
+    "Enable lsp-mode if the current major mode is included in
+t/lsp-enabled-modes. Otherwise, enable format-all-mode and use
+dumb-jump as the xref backend."
+    (cond ((member major-mode t/lsp-enabled-modes)
+           (lsp))
+          ((derived-mode-p 'prog-mode)
+           (progn (when (require 'format-all nil t)
+                    (format-all-mode t))
+                  (when (require 'dumb-jump nil t)
+                    (add-hook 'xref-backend-functions #'dumb-jump-xref-activate nil t))))))
+  (defun t/lsp-onsave ()
+    "Configure LSP to automatically format all code on save in
+lsp-enabled buffers."
+    (lsp-enable-which-key-integration)
+    (cond ((derived-mode-p 'c++-mode)
+           (add-hook 'before-save-hook #'clang-format-buffer nil 'local))
+          (t (add-hook 'before-save-hook #'lsp-format-buffer nil 'local)))
+    (add-hook 'before-save-hook #'lsp-organize-imports nil 'local))
+  :hook
+  ((prog-mode . t/maybe-lsp)
+   (lsp-mode . t/lsp-onsave)))
+
+;; UI frontend for language server alerts and info
+(use-package lsp-ui
+  :straight t
+  :defer t
+  :after lsp
+  :config
+  (setq lsp-ui-doc-position 'bottom))
+
+;; python language server
+(use-package lsp-python-ms
+  :straight t
+  :defer t
+  :init (setq lsp-python-ms-auto-install-server t)
+  :hook (python-mode . (lambda ()
+                         (require 'lsp-python-ms)
+                         (lsp))))
+
+;;;;; Tree-sitter
+
+;; tree sitter
+(use-package tree-sitter
+  :straight t
+  :hook
+  ((prog-mode . turn-on-tree-sitter-mode)
+   (tree-sitter-after-on . tree-sitter-hl-mode)))
+
+(use-package tree-sitter-langs
+  :straight t
+  :after tree-sitter)
+
+(use-package tree-sitter-indent
+  :straight t
+  :after tree-sitter)
+
+;;;;; Tools
+
+;; terminal emulator
+(use-package vterm
+  :straight t
+  :defer t
+  :commands vterm
+  :bind ("C-c o t" . vterm))
+(use-package eshell
+  :defer t
+  :bind ("C-c o e" . eshell))
+
+;; package manager
+;; doesn't populate completions like helm-pac-man
+;; maybe look at helm's implementation and recreate it with completing-read?
+(use-package system-packages
+  :straight t
+  :config
+  (setq system-packages-package-manager 'brew
+        system-packages-use-sudo nil))
+
+;;;; Email
 
 ;; view email; requires installing mu (maildir-utils on some distros) first
 (use-package mu4e

  ;; hide dotfiles with C-x M-o
  (setq dired-omit-files "^\\..\\{2,\\}")  ; default: "\\`[.]?#\\|\\`[.][.]?\\'"
  :bind ("C-x C-j" . #'dired-jump))

;; ~M-o~ to change window
(use-package ace-window
  :straight t
  :config
  (setq aw-scope 'frame)
  :bind
  ("M-o" . #'ace-window))

;; isearch alternative across frame
(use-package avy
  :straight t
  :bind
  (("M-j" . #'avy-goto-char-timer)
   :map isearch-mode-map
   ("M-j" . #'avy-isearch)))

;; available keybinds popup with "C-h" during key chords
(use-package which-key
  :straight t
  :config
  (setq
   ;; Only show popup on "C-h"
   which-key-show-early-on-C-h t
   which-key-idle-delay 10000
   which-key-idle-secondary-delay 0.05)
  (which-key-mode)
  ;; prefer right side, then bottom for popup
  (which-key-setup-side-window-right-bottom)
  :bind ("C-c h k" . #'which-key-show-top-level))

;; file explorer window
(use-package treemacs

      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

;; Macro for organized package configuration
(setq use-package-enable-imenu-support t)
(straight-use-package 'use-package)

