* Blocks, Parentheses and Formatting Oh My!

** Parentheses, and Structural Editing

Sometimes if I delete a parenthesis out of hand I spend the next minute or two
kicking myself as I count the parentheses here and there.  Well no more!  With
[[https://shaunlebron.github.io/parinfer/][Parinfer]] structural editing, and taming parentheses becomes a
breeze.

#+begin_src emacs-lisp
(use-package parinfer-rust-mode
  :ensure t
  :init
  (setq parinfer-rust-auto-download t)
  :hook
  (emacs-lisp-mode . parinfer-rust-mode)
  (clojure-mode . parinfer-rust-mode)
  (clojure-ts-mode . parinfer-rust-mode))
#+end_src

I also have =smart-parens= for parentheses matching in modes where =parinfer= would
be overkill.

#+begin_src  emacs-lisp
(use-package smartparens
  :ensure t
  :hook (prog-mode text-mode markdown-mode)
  :config
  (require 'smartparens-config))
#+end_src

Might as well highlight the parentheses to make them easier to spot.

#+begin_src emacs-lisp
(use-package indent-bars
  :ensure t
  :hook ((emacs-lisp-mode 
          c-ts-mode
          c++-ts-mode 
          clojure-ts-mode
          elisp-mode
          lisp-mode 
          rust-ts-mode 
          ruby-ts-mode) . indent-bars-mode)
  :custom
  ;; Character used for the bar (for terminal or if stipples are disabled)
  (indent-bars-char "|") 
  ;; The width of the bar (0.1 to 1.0)
  (indent-bars-width-frac 0.1)
  ;; How "offset" the bar is from the left
  (indent-bars-pad-frac 0.1)
  ;; Whether to draw bars on the first level of indentation
  (indent-bars-starting-column 0)
  ;; Tree-sitter support (highly recommended for C, Rust, and Ruby)
  (indent-bars-treesit-support t)
  ;; Optimization: don't draw bars in strings/comments
  (indent-bars-no-descend-lists t)
  :config
  (setq
    indent-bars-color '(highlight :face-bg t :blend 0.15)
    indent-bars-pattern "."
    indent-bars-width-frac 0.1
    indent-bars-pad-frac 0.1
    indent-bars-zigzag nil
    indent-bars-color-by-depth '(:regexp "outline-\\([0-9]+\\)" :blend 1) ; blend=1: blend with BG only
    indent-bars-highlight-current-depth '(:blend 0.5) ; pump up the BG blend on current
    indent-bars-display-on-blank-lines t))
#+end_src

** Apheleia

[[https://github.com/radian-software/apheleia][Aphelia]] tries to use the right formatting for any file and applies it asynchronously.

#+BEGIN_SRC emacs-lisp
(use-package apheleia
  :config
  (apheleia-global-mode +1)
  (setf (alist-get 'c-ts-mode apheleia-mode-alist) '(clang-format))
  (setf (alist-get 'c++-ts-mode apheleia-mode-alist) '(clang-format)))
#+END_SRC

** Indentation Level

#+begin_src emacs-lisp
;; Indent guides
(use-package highlight-indent-guides
  :defer t
  :hook (prog-mode . highlight-indent-guides-mode))
#+end_src

** List, and String Improvements

#+begin_src emacs-lisp
(use-package dash :ensure t)
(use-package s :ensure t)
#+end_src
