diff --git a/emacs.d/editing.el b/emacs.d/editing.el index c42e902..981a265 100644 --- a/emacs.d/editing.el +++ b/emacs.d/editing.el @@ -15,9 +15,77 @@ ;; (corfu-history-mode 1) ;; (add-to-list 'savehist-additional-variables 'corfu-history))) -(setq-default tab-width 4) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Fucking tabs, man .... +;; +;; +;; +;; Tabs for indentation, Spaces for alignment. This is *always* the correct +;; method, and will always be the correct method as long as there are space +;; heathens out there who see nothing wrong with enforcing their preferred +;; indentation size (by way of it being fixed in stone by being in spaces +;; instead of tabs) on everyone else. But, after trying to do "tabs for +;; indentation, spaces for alignment" in Emacs for a little bit now, and also +;; seeing how Emacs handles tabs out of the box, I understand a little tiny bit +;; more why so many people might want to advocate spaces-only, even if I very +;; strongly disagree with it. Emacs has some pretty horrific behaviour if you +;; try to switch tabs to be actual tabs instead of spaces. I actually think that +;; when it comes to tabs, Emacs may very well be one of the worst editors I've +;; seen. I think this is mainly due to the fact that Emacs overloads the +;; behaviour of the tab key, where it actually performs some kind of +;; auto-magical "indent to the correct level" behaviour (which is of fairly +;; questionable effectiveness from what I've witnessed), combined with the +;; typical Emacs completion configuration being *also* bound to the tab key! It +;; really is quite maddening. And un-fucking this behaviour is also quite +;; maddeninng, which is why I said before that I think Emacs might very well be +;; one of the worst editors I've seen when it comes to configuring tab key +;; behaviour. The configuration is just stupidly complicated and hard to figure +;; out. There may very well be a "correct" way to fix this that keeps tabs for +;; indentation and works well for all language modes, and keeps the default +;; Emacs tab key binding ... but good fucking luck find this configuration. +;; +;; I am an adult, and I am quite capable of hitting the tab key until I get to +;; the correct indentation level. Yes, maybe sometimes I might have to hit the +;; tab key twice, or three times maybe. Big fucking deal. I don't need some +;; dumb "auto-magical-indent" key unless it is actually proven to work out of +;; the box with sane defaults across all language modes. Emacs does *not* fit +;; into this restriction, thus the only sane thing to do is to bind the tab +;; key to insert tabs (or spaces, of course) only and not to try to do any +;; auto-indent behaviour at all. Just insert tabs or spaces according to +;; `indent-tabs-mode` and DO NOTHING ELSE. +;; +;; + +;; this extra var just so that we always have it around and won't ever be +;; rebound by some other mode +(setq my-preferred-tab-width 4) + +(setq-default tab-width my-preferred-tab-width) (setq-default indent-tabs-mode t) -(setq-default tab-always-indent t) +;;(setq-default tab-always-indent t) +(setq-default electric-indent-inhibit t) +(setq backward-delete-char-untabify-method 'hungry) + +(defun gered/enable-tabs () + (interactive) + (message "gered/enable-tabs for %s" (buffer-name)) + (local-set-key (kbd "TAB") 'tab-to-tab-stop) + (setq-local tab-width my-preferred-tab-width) + (setq-local indent-tabs-mode t)) + +(defun gered/disable-tabs (&optional override-tab-width) + (interactive) + (message "gered/disable-tabs for %s" (buffer-name)) + (local-set-key (kbd "TAB") 'tab-to-tab-stop) + (setq-local tab-width (or override-tab-width my-preferred-tab-width)) + (setq-local indent-tabs-mode nil)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(global-set-key (kbd "C->") 'indent-rigidly-right-to-tab-stop) +(global-set-key (kbd "C-<") 'indent-rigidly-left-to-tab-stop) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package corfu :ensure t @@ -68,8 +136,21 @@ (use-package dtrt-indent :ensure t :config - (setq dtrt-indent-verbosity 0) + (setq dtrt-indent-verbosity 3) + (setq dtrt-indent-min-quality 75.0) (setq dtrt-indent-run-after-smie t) + (setq dtrt-indent-hook-mapping-list + (append + ;; TODO: override more of these. it may be best to write some generic function + ;; that pre-adds `tab-width` to every single value in this list, and only + ;; then go and add the missing modes? + ;; list ref: https://github.com/jscheid/dtrt-indent/blob/master/dtrt-indent.el#L328 + '((js-ts-mode javascript (js-indent-level tab-width)) + (yaml-ts-mode default (yaml-indent-offset tab-width)) + (php-mode c/c++/java (c-basic-offset tab-width)) + (nxml-mode sgml (nxml-child-indent tab-width)) + ) + (eval 'dtrt-indent-hook-mapping-list))) (dtrt-indent-global-mode t)) (use-package paredit diff --git a/emacs.d/lang-modes.el b/emacs.d/lang-modes.el index 93abf1d..05f4b23 100644 --- a/emacs.d/lang-modes.el +++ b/emacs.d/lang-modes.el @@ -1,3 +1,10 @@ +;; for the most part, we want to use tabs for indentation +(add-hook 'prog-mode-hook 'gered/enable-tabs) +(add-hook 'text-mode-hook 'gered/enable-tabs) +(add-hook 'conf-mode-hook 'gered/enable-tabs) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (use-package treesit-auto :ensure t :custom @@ -8,14 +15,11 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(use-package emacs-lisp-mode - :hook ((emacs-lisp-mode . gered/on-emacs-lisp-mode)) - :init - (defun gered/on-emacs-lisp-mode () - (lambda () - ;; TODO: is this even necessary or was i seeing something odd caused by my own (prior) mistakes? - (setq-local indent-tabs-mode nil) - (setq-local tab-width 2)))) +(defun gered/on-lispy-mode () + (gered/disable-tabs 2)) + +(add-hook 'emacs-lisp-mode-hook 'gered/on-lispy-mode) +(add-hook 'lisp-mode-hook 'gered/on-lispy-mode) (use-package lisp-extra-font-lock :ensure t @@ -27,7 +31,15 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package yaml-mode - :ensure t) + :ensure t + :config + (setq yaml-indent-offset 2)) + +(defun gered/on-yaml-mode () + (gered/disable-tabs yaml-indent-offset)) + +(add-hook 'yaml-mode-hook 'gered/on-yaml-mode) +(add-hook 'yaml-ts-mode-hook 'gered/on-yaml-mode) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -63,19 +75,21 @@ (use-package js :config - (setq js-indent-level tab-width)) + (setq js-indent-level my-preferred-tab-width)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package lua-mode - :ensure t) + :ensure t + :config + (setq lua-indent-level my-preferred-tab-width)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package c-ts-mode :config (setq-default c-ts-mode-indent-style 'linux) - (setq-default c-ts-mode-indent-offset tab-width)) + (setq-default c-ts-mode-indent-offset my-preferred-tab-width)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -102,3 +116,16 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package sgml-mode + :config + (setq sgml-basic-offset my-preferred-tab-width)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(use-package nxml-mode + :config + (setq nxml-child-indent my-preferred-tab-width) + (setq nxml-attribute-indent my-preferred-tab-width) + (setq nxml-slash-auto-complete-flag t)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;