summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore10
-rwxr-xr-xcheck-init.el8
-rw-r--r--dir-locals/c++-dir-locals.el6
-rw-r--r--dir-locals/elisp-dir-locals.el2
-rw-r--r--dir-locals/python-dir-locals.el6
-rw-r--r--dir-locals/rust-dir-locals.el4
-rw-r--r--early-init.el2
-rw-r--r--init.el94
-rw-r--r--lisp/best-side-window/best-side-window.el52
-rw-r--r--lisp/flycheck-nasm/flycheck-nasm.el37
-rw-r--r--lisp/fmt/fmt.el80
-rw-r--r--lisp/license-boilerplate/license-boilerplate.el32
-rw-r--r--lisp/man-completion/man-completion.el48
-rw-r--r--lisp/packages.el41
-rw-r--r--lisp/reload-library/reload-library.el37
-rw-r--r--lisp/toggle-local-vars/toggle-local-vars.el22
-rw-r--r--lisp/wgetpaste/LICENSE (renamed from LICENSE)0
-rw-r--r--lisp/wgetpaste/README.org (renamed from README.org)0
-rw-r--r--lisp/wgetpaste/wgetpaste.el (renamed from wgetpaste.el)0
-rw-r--r--packages/company.el4
-rw-r--r--packages/conf-mode.el9
-rw-r--r--packages/dired.el4
-rw-r--r--packages/ebuild-mode.el11
-rw-r--r--packages/ediff.el4
-rw-r--r--packages/eglot.el3
-rw-r--r--packages/flycheck.el9
-rw-r--r--packages/flymake.el8
-rw-r--r--packages/highlight-indentation.el2
-rw-r--r--packages/ibuffer.el10
-rw-r--r--packages/ielm.el3
-rw-r--r--packages/image-dired.el3
-rw-r--r--packages/magit.el3
-rw-r--r--packages/man.el3
-rw-r--r--packages/nasm-mode.el3
-rw-r--r--packages/pixel-scroll.el8
-rw-r--r--packages/prog-mode.el9
-rw-r--r--packages/recentf.el3
-rw-r--r--packages/savehist.el4
-rw-r--r--packages/saveplace.el4
-rw-r--r--packages/sh-script.el3
-rw-r--r--packages/text-mode.el4
-rw-r--r--packages/tramp.el8
-rw-r--r--packages/transient.el5
-rw-r--r--packages/treesit.el36
-rw-r--r--themes/badger-theme.el12
45 files changed, 656 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..16271d5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+/*
+!/.gitignore
+!/init.el
+!/early-init.el
+!/check-init.el
+!/themes
+!/init
+!/lisp
+!/packages
+!/dir-locals
diff --git a/check-init.el b/check-init.el
new file mode 100755
index 0000000..0723e82
--- /dev/null
+++ b/check-init.el
@@ -0,0 +1,8 @@
+#!/usr/bin/env -S emacs --script
+
+(kill-emacs (condition-case nil
+ (progn
+ (load (file-name-concat user-emacs-directory "early-init.el"))
+ (load (file-name-concat user-emacs-directory "init.el")))
+ (error 1)
+ (:success 0)))
diff --git a/dir-locals/c++-dir-locals.el b/dir-locals/c++-dir-locals.el
new file mode 100644
index 0000000..a5c04b4
--- /dev/null
+++ b/dir-locals/c++-dir-locals.el
@@ -0,0 +1,6 @@
+((c++-mode
+ . ((fmt-executable . "clang-format")
+ (eval . (add-hook 'before-save-hook 'fmt-current-buffer nil t))
+ (eval . (add-to-list 'eglot-server-programs '(c++-mode . ("clangd" "-header-insertion=never"))))
+ (eval . (eglot-ensure))
+ (eval . (company-mode 1)))))
diff --git a/dir-locals/elisp-dir-locals.el b/dir-locals/elisp-dir-locals.el
new file mode 100644
index 0000000..b6c3793
--- /dev/null
+++ b/dir-locals/elisp-dir-locals.el
@@ -0,0 +1,2 @@
+((emacs-lisp-mode) . ((company-mode . 1)
+ (eldoc-mode . 1)))
diff --git a/dir-locals/python-dir-locals.el b/dir-locals/python-dir-locals.el
new file mode 100644
index 0000000..8bd8ac1
--- /dev/null
+++ b/dir-locals/python-dir-locals.el
@@ -0,0 +1,6 @@
+((python-ts-mode . ((eval . (flycheck-mode 1))
+ (eval . (flycheck-select-checker 'python-mypy))
+ (eval . (flycheck-add-next-checker 'python-mypy (cons t 'python-flake8)))
+ (eval . (add-hook 'before-save-hook 'fmt-current-buffer nil t))
+ (eval . (setq-local fmt-executable "black"
+ fmt-args '("-"))))))
diff --git a/dir-locals/rust-dir-locals.el b/dir-locals/rust-dir-locals.el
new file mode 100644
index 0000000..ef4f8fa
--- /dev/null
+++ b/dir-locals/rust-dir-locals.el
@@ -0,0 +1,4 @@
+((rust-ts-mode . ((eglot-workspace-configuration . (:rust-analyzer (:check (:command "clippy"))))
+ (fmt-executable . "rustfmt")
+ (eval . (eglot-ensure))
+ (eval . (add-hook 'before-save-hook 'fmt-current-buffer nil t)))))
diff --git a/early-init.el b/early-init.el
new file mode 100644
index 0000000..da48e00
--- /dev/null
+++ b/early-init.el
@@ -0,0 +1,2 @@
+(setq native-comp-async-jobs-number (string-to-number (shell-command-to-string "nproc"))
+ native-compile-target-directory (file-name-concat (getenv "HOME") ".cache/emacs-native-comp"))
diff --git a/init.el b/init.el
new file mode 100644
index 0000000..d4b6328
--- /dev/null
+++ b/init.el
@@ -0,0 +1,94 @@
+(require 'site-gentoo)
+(require 'use-package)
+(require 'cl-lib)
+(require 'seq)
+(require 'server)
+(require 'edebug)
+(require 'xdg)
+
+(global-unset-key (kbd "<left>"))
+(global-unset-key (kbd "<right>"))
+(global-unset-key (kbd "<up>"))
+(global-unset-key (kbd "<down>"))
+(global-unset-key (kbd "<C-left>"))
+(global-unset-key (kbd "<C-right>"))
+(global-unset-key (kbd "<C-up>"))
+(global-unset-key (kbd "<C-down>"))
+(global-set-key (kbd "C-x k") 'kill-this-buffer)
+(global-set-key (kbd "C-x C-b") 'ibuffer)
+
+(setq auth-source-save-behavior nil
+ auto-save-default nil
+ change-major-mode-with-file-name nil
+ custom-buffer-indent 4
+ custom-file "/dev/null"
+ custom-theme-directory (file-name-concat user-emacs-directory "themes/")
+ debugger 'edebug
+ display-buffer-base-action '(display-buffer-same-window display-buffer-reuse-window)
+ initial-buffer-choice (lambda ()
+ (let ((initial-file (file-name-concat
+ user-emacs-directory
+ "initial-buffer")))
+ (if (file-exists-p initial-file)
+ (find-file initial-file)
+ (get-buffer-create "*scratch*"))))
+ enable-local-variables :safe
+ gc-cons-threshold (* 8 (expt 1024 2))
+ inhibit-splash-screen t
+ make-backup-files nil
+ mouse-wheel-progressive-speed nil
+ tab-width 4
+ temporary-file-directory (file-name-concat (or (getenv "TMPDIR") "/tmp") ".emacs")
+ use-package-always-demand t
+ use-package-ensure-function 'ignore
+ user-full-name "John Turner"
+ user-mail-address "jturner.usa@gmail.com")
+
+(setq-default create-lockfiles nil
+ display-fill-column-indicator-column 120
+ indent-tabs-mode nil)
+
+(setq-default mode-line-format '("%*"
+ " "
+ (:eval (if buffer-file-name
+ (abbreviate-file-name buffer-file-name)
+ (buffer-name)))
+ " "
+ "(" mode-name ")"
+ " "
+ "(" (:eval (if server-process
+ (process-name server-process)
+ "_"))
+ ")"))
+
+(load-file (locate-user-emacs-file "lisp/packages.el"))
+
+(cl-loop with packages-directory = (file-name-concat user-emacs-directory "packages")
+ for package in (directory-files packages-directory t)
+ unless (seq-contains-p '("." "..") (file-name-base package))
+ do (load-file package))
+
+(mkdir temporary-file-directory t)
+
+(cua-mode 1)
+(save-place-mode 1)
+(show-paren-mode 1)
+(recentf-mode 1)
+(savehist-mode 1)
+(when (featurep 'pixel-scroll)
+ (pixel-scroll-mode 1))
+
+(menu-bar-mode 0)
+(scroll-bar-mode 0)
+(tool-bar-mode 0)
+(tooltip-mode 0)
+(auto-save-mode 0)
+
+(load-theme 'wombat)
+(load-theme 'badger t)
+
+(set-face-attribute
+ 'default nil
+ :family "Noto Sans Mono"
+ :foundry "GOOG"
+ :slant 'normal)
diff --git a/lisp/best-side-window/best-side-window.el b/lisp/best-side-window/best-side-window.el
new file mode 100644
index 0000000..12118fa
--- /dev/null
+++ b/lisp/best-side-window/best-side-window.el
@@ -0,0 +1,52 @@
+;;; best-side-window.el --- -*- lexical-binding: t; -*-
+
+;; Copyright John Turner (C) 2023
+
+;; Author: John Turner
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+(require 'cl-lib)
+
+(defgroup best-side-window nil "Select ideal side to display buffer")
+
+(defcustom -default-side 'bottom
+ "Default side to display buffer if -choose-best-side-functions fails to choose a side")
+
+(defcustom -choose-best-side-functions nil
+ "The first non-nil return value will be used as the side to use for display buffer")
+
+(defun -best-side ()
+ (cl-loop for f in -choose-best-side-functions
+ for result = (funcall f)
+ if result
+ return result))
+
+(defun -display-buffer-in-best-side-window (buffer alist)
+ (let ((side (or (-best-side) -default-side)))
+ (display-buffer-in-side-window buffer (cons (cons 'side side) alist))))
+
+(defun -bottom-when-frame-split ()
+ (if (< (frame-pixel-width) (/ (display-pixel-width) 2))
+ 'bottom
+ -default-side))
+
+(add-to-list '-choose-best-side-functions '-bottom-when-frame-split)
+
+(provide 'best-side-window)
+;;; best-side-window.el ends here
+
+;; Local Variables:
+;; read-symbol-shorthands: (("-" . "best-side-window-"))
+;; End:
diff --git a/lisp/flycheck-nasm/flycheck-nasm.el b/lisp/flycheck-nasm/flycheck-nasm.el
new file mode 100644
index 0000000..9ff9bde
--- /dev/null
+++ b/lisp/flycheck-nasm/flycheck-nasm.el
@@ -0,0 +1,37 @@
+;;; flycheck-nasm-mode.el --- flycheck checker for NASM -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2024 John Turner
+
+;; Author: John Turner jturner.usa@gmail.com
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+
+;;; Code:
+
+(require 'flycheck)
+
+(flycheck-def-option-var flycheck-nasm-format "elf64" nasm
+ "NASM executable format."
+ :type 'string)
+
+(flycheck-define-checker nasm
+ "Flycheck checker for NASM."
+ :command ("nasm" "-o" "/dev/null" (option "-f" flycheck-nasm-format) source)
+ :error-patterns ((error line-start (file-name) ":" line ":" space "error:" space (message) line-end)
+ (warning line-start (file-name) ":" line ":" space "warning:" space (message) line-end))
+ :modes (asm-mode nasm-mode))
+
+(provide 'flycheck-nasm)
+;;; flycheck-nasm-mode.el ends here
diff --git a/lisp/fmt/fmt.el b/lisp/fmt/fmt.el
new file mode 100644
index 0000000..5ac97e3
--- /dev/null
+++ b/lisp/fmt/fmt.el
@@ -0,0 +1,80 @@
+;;; fmt.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 John Turner
+
+;; Author: John Turner <notroot@gentoo-pc>
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+(defgroup fmt nil
+ "Format buffers using external programs such as rustfmt.")
+
+(defcustom fmt-executable nil
+ "Formatter executable to use for formatting a buffer."
+ :local t
+ :type '(string)
+ :group 'fmt)
+
+(defcustom fmt-args nil
+ "Args to use when running fmt-executable."
+ :local t
+ :type '(repeat string)
+ :group 'fmt)
+
+(defcustom fmt-stdout-buffer "*fmt stdout*"
+ "Buffer to send fmt-executable stdout to."
+ :type '(string)
+ :group 'fmt)
+
+(defcustom fmt-stderr-buffer "*fmt stderr*"
+ "Buffer to send fmt-executable stderr to."
+ :type '(string)
+ :group 'fmt)
+
+(defcustom fmt-before-format-hook nil
+ "Hooks to run before fmt-executable runs."
+ :type '(hook)
+ :group 'fmt)
+
+(define-error 'fmt-failure "fmt-failure")
+
+(defun fmt-buffer ()
+ (run-hooks 'fmt-before-format-hook)
+ (let ((exit-status (apply 'call-process-region `(,(point-min) ,(point-max) ,fmt-executable
+ nil ,(list fmt-stdout-buffer fmt-stderr-buffer)
+ nil ,@fmt-args))))
+ (if (zerop exit-status)
+ (replace-buffer-contents fmt-stdout-buffer)
+ (signal 'fmt-failure nil))))
+
+(defun fmt-current-buffer ()
+ (interactive)
+ (condition-case _ (fmt-buffer)
+ ('fmt-failure (message "%s failed, see %s for more details" fmt-executable fmt-stderr-buffer))))
+
+;; hooks
+
+(defun fmt-erase-stdout-buffer ()
+ (with-current-buffer (get-buffer-create fmt-stdout-buffer)
+ (erase-buffer)))
+
+(defun fmt-erase-stderr-buffer ()
+ (with-current-buffer (get-buffer-create fmt-stderr-buffer)
+ (erase-buffer)))
+
+(add-hook 'fmt-before-format-hook 'fmt-erase-stdout-buffer)
+(add-hook 'fmt-before-format-hook 'fmt-erase-stderr-buffer)
+
+(provide 'fmt)
+;;; fmt.el ends here
diff --git a/lisp/license-boilerplate/license-boilerplate.el b/lisp/license-boilerplate/license-boilerplate.el
new file mode 100644
index 0000000..008d8ad
--- /dev/null
+++ b/lisp/license-boilerplate/license-boilerplate.el
@@ -0,0 +1,32 @@
+(defgroup license-boilerplate nil
+ "A small script for inserting license boilerplate text into source files.")
+
+(defcustom license-boilerplate-copyright-author user-full-name
+ "The value to insert into the Copyright line."
+ :group 'license-boilerplate
+ :type 'string)
+
+(defun license-boilerplate-gpl-3 ()
+ (interactive)
+ (save-excursion
+ (let ((saved-point (point)))
+ (insert (format "Copyright (C) %s" (format-time-string "%Y")))
+ (when-let ((author license-boilerplate-copyright-author))
+ (insert (format " %s" author)))
+ (insert "\n")
+ (insert "
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.")
+ (comment-region saved-point (point)))))
+
+(provide 'license-boilerplate)
diff --git a/lisp/man-completion/man-completion.el b/lisp/man-completion/man-completion.el
new file mode 100644
index 0000000..31c5bf7
--- /dev/null
+++ b/lisp/man-completion/man-completion.el
@@ -0,0 +1,48 @@
+(defun man-completion-is-compression-suffix (suffix)
+ (string-match-p "\\.bz2$\\|gzip$\\|zst$" suffix))
+
+(defun man-completion-get-man-paths ()
+ (let* ((manpath (getenv "MANPATH"))
+ (manpaths (split-string manpath ":" t))
+ (manpaths (mapcar (lambda (path)
+ (file-expand-wildcards (file-name-concat path "man*")))
+ manpaths))
+ (manpaths (flatten-list manpaths))
+ (manpaths (seq-filter 'file-exists-p manpaths)))
+ manpaths))
+
+(defun man-completion-find-pages ()
+ (let* ((files (mapcar (lambda (p)
+ (directory-files-recursively p ".+" nil))
+ (man-completion-get-man-paths)))
+ (files (flatten-list files))
+ (files (mapcar 'file-name-base files))
+ (files (mapcar (lambda (f)
+ (if (man-completion-is-compression-suffix f)
+ (file-name-sans-extension f)
+ f))
+ files)))
+ files))
+
+(defun man-completion-locate-page (page)
+ (with-temp-buffer
+ (let ((exit-code (call-process "man" nil (current-buffer) nil "--where" page)))
+ (when exit-code
+ (let* ((output (buffer-string))
+ (trimmed (string-trim-right output "\n")))
+ trimmed)))))
+
+(defun man-completion (orig &rest args)
+ (interactive)
+ (let* ((arg (if args
+ (nth 0 args)
+ (completing-read "Select page: "
+ (man-completion-find-pages)
+ nil
+ t)))
+ (page (man-completion-locate-page arg)))
+ (funcall orig page)))
+
+(advice-add 'man :around 'man-completion)
+
+(provide 'man-completion)
diff --git a/lisp/packages.el b/lisp/packages.el
new file mode 100644
index 0000000..3a32b2b
--- /dev/null
+++ b/lisp/packages.el
@@ -0,0 +1,41 @@
+;;; packages.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023
+
+;; Author: John Turner
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+(use-package man-completion
+ :load-path (lambda () (locate-user-emacs-file "lisp/man-completion")))
+
+(use-package reload-library
+ :load-path (lambda () (locate-user-emacs-file "lisp/reload-library")))
+
+(use-package toggle-local-vars
+ :load-path (lambda () (locate-user-emacs-file "lisp/toggle-local-vars")))
+
+(use-package license-boilerplate
+ :load-path (lambda () (locate-user-emacs-file "lisp/license-boilerplate"))
+ :custom
+ (license-boilerplate-copyright-author "John Turner"))
+
+(use-package best-side-window
+ :load-path (lambda () (locate-user-emacs-file "lisp/best-side-window")))
+
+(use-package fmt
+ :load-path (lambda () (locate-user-emacs-file "lisp/fmt")))
+
+(use-package flycheck-nasm
+ :load-path (lambda () (locate-user-emacs-file "lisp/flycheck-nasm")))
diff --git a/lisp/reload-library/reload-library.el b/lisp/reload-library/reload-library.el
new file mode 100644
index 0000000..fde75e4
--- /dev/null
+++ b/lisp/reload-library/reload-library.el
@@ -0,0 +1,37 @@
+;;; reload-library.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+(require 'loadhist)
+
+(defun reload-library ()
+ (interactive)
+ (let* ((library (read-string
+ "Library to reload: "
+ (buffer-file-name)))
+ (feature (intern (file-name-base library)))
+ (loaded (featurep feature))
+ (dependents (file-dependents library)))
+ (when (and loaded (or (not dependents)
+ (yes-or-no-p (format "%s is required by another library, force reload?" feature))))
+ (unload-feature feature t))
+ (load-library library)))
+
+
+
+(provide 'reload-library)
+;;; reload-library.el ends here
+
diff --git a/lisp/toggle-local-vars/toggle-local-vars.el b/lisp/toggle-local-vars/toggle-local-vars.el
new file mode 100644
index 0000000..9d20454
--- /dev/null
+++ b/lisp/toggle-local-vars/toggle-local-vars.el
@@ -0,0 +1,22 @@
+(defun toggle-local-vars-on ()
+ (interactive)
+ (setq enable-local-variables t)
+ (message "enabled local variables"))
+
+(defun toggle-local-vars-off ()
+ (interactive)
+ (setq enable-local-variables nil)
+ (message "disabled local variables"))
+
+(defun toggle-remote-local-vars-on ()
+ (interactive)
+ (setq enable-remote-dir-locals t
+ enable-local-variables t)
+ (message "enabled local variables"))
+
+(defun toggle-remote-local-vars-off ()
+ (interactive)
+ (setq enable-remote-dir-locals nil)
+ (message "disabled local variables"))
+
+(provide 'toggle-local-vars)
diff --git a/LICENSE b/lisp/wgetpaste/LICENSE
index f288702..f288702 100644
--- a/LICENSE
+++ b/lisp/wgetpaste/LICENSE
diff --git a/README.org b/lisp/wgetpaste/README.org
index 7c84957..7c84957 100644
--- a/README.org
+++ b/lisp/wgetpaste/README.org
diff --git a/wgetpaste.el b/lisp/wgetpaste/wgetpaste.el
index 64f8350..64f8350 100644
--- a/wgetpaste.el
+++ b/lisp/wgetpaste/wgetpaste.el
diff --git a/packages/company.el b/packages/company.el
new file mode 100644
index 0000000..59612c4
--- /dev/null
+++ b/packages/company.el
@@ -0,0 +1,4 @@
+(use-package company
+ :custom
+ (company-minimum-prefix-length 2)
+ (company-idle-delay 0))
diff --git a/packages/conf-mode.el b/packages/conf-mode.el
new file mode 100644
index 0000000..304f72a
--- /dev/null
+++ b/packages/conf-mode.el
@@ -0,0 +1,9 @@
+(use-package conf-mode
+ :hook
+ (prog-mode . visual-line-mode)
+ (prog-mode . display-line-numbers-mode)
+ (prog-mode . electric-pair-mode)
+ (prog-mode . electric-indent-mode)
+ (prog-mode . (lambda ()
+ (when (featurep 'highlight-indentation)
+ (highlight-indentation-mode 1)))))
diff --git a/packages/dired.el b/packages/dired.el
new file mode 100644
index 0000000..02f6d72
--- /dev/null
+++ b/packages/dired.el
@@ -0,0 +1,4 @@
+(use-package dired
+ :custom
+ (dired-listing-switches "-ahl --group-directories-first")
+ (dired-kill-when-opening-new-dired-buffer t))
diff --git a/packages/ebuild-mode.el b/packages/ebuild-mode.el
new file mode 100644
index 0000000..f3b3448
--- /dev/null
+++ b/packages/ebuild-mode.el
@@ -0,0 +1,11 @@
+(use-package ebuild-mode
+ :if (locate-library "ebuild-mode")
+ :mode (rx (literal ".") (or "ebuild" "eclass") eos)
+ :custom
+ (ebuild-mode-full-name "John Turner")
+ (ebuild-mode-mail-address "jturner.usa@gmail.com")
+ (ebuild-mode-portage-tmpdir (file-name-concat (getenv "HOME") "tmp" "ebuild"))
+ (ebuild-mode-portdir "/var/db/repos/gentoo")
+ (ebuild-mode-xml-indent-tabs t)
+ (ebuild-mode-process-environment (list (format "ROOT=%s" ebuild-mode-portage-tmpdir)
+ (format "PORTAGE_TMPDIR=%s" ebuild-mode-portage-tmpdir))))
diff --git a/packages/ediff.el b/packages/ediff.el
new file mode 100644
index 0000000..88f1eb1
--- /dev/null
+++ b/packages/ediff.el
@@ -0,0 +1,4 @@
+(use-package ediff
+ :custom
+ (ediff-split-window-function 'split-window-horizontally)
+ (ediff-window-setup-function 'ediff-setup-windows-plain))
diff --git a/packages/eglot.el b/packages/eglot.el
new file mode 100644
index 0000000..dc72df2
--- /dev/null
+++ b/packages/eglot.el
@@ -0,0 +1,3 @@
+(use-package eglot
+ :if (locate-library "eglot")
+ :custom (eglot-autoshutdown t))
diff --git a/packages/flycheck.el b/packages/flycheck.el
new file mode 100644
index 0000000..2ea1e66
--- /dev/null
+++ b/packages/flycheck.el
@@ -0,0 +1,9 @@
+(use-package flycheck
+ :hook
+ (flycheck-error-list-mode . visual-line-mode)
+ :custom
+ (flycheck-python-mypy-cache-dir (file-name-concat (getenv "HOME") ".cache" "mypy"))
+ :config
+ (when (require 'best-side-window nil t)
+ (add-to-list 'display-buffer-alist '((major-mode . flycheck-error-list-mode)
+ best-side-window-display-buffer-in-best-side-window))))
diff --git a/packages/flymake.el b/packages/flymake.el
new file mode 100644
index 0000000..b39be0f
--- /dev/null
+++ b/packages/flymake.el
@@ -0,0 +1,8 @@
+(use-package flymake
+ :hook
+ (flymake-diagnostics-buffer-mode . visual-line-mode)
+ :config
+ (when (require 'best-side-window nil t)
+ (add-to-list 'display-buffer-alist '((major-mode . flymake-diagnostics-buffer-mode)
+ best-side-window-display-buffer-in-best-side-window))))
+
diff --git a/packages/highlight-indentation.el b/packages/highlight-indentation.el
new file mode 100644
index 0000000..499f6e9
--- /dev/null
+++ b/packages/highlight-indentation.el
@@ -0,0 +1,2 @@
+(use-package highlight-indentation
+ :if (locate-library "highlight-indentation"))
diff --git a/packages/ibuffer.el b/packages/ibuffer.el
new file mode 100644
index 0000000..d5d4cd9
--- /dev/null
+++ b/packages/ibuffer.el
@@ -0,0 +1,10 @@
+(use-package ibuffer
+ :custom
+ (ibuffer-display-summary nil)
+ (ibuffer-expert t)
+ (ibuffer-formats '((mark modified read-only locked
+ " " (name 32 32 :left :elide)
+ " " (size 5 5 :right)
+ " " (mode 16 16 :left :elide)
+ " " filename-and-process)
+ (mark " " (name 16 -1) " " filename))))
diff --git a/packages/ielm.el b/packages/ielm.el
new file mode 100644
index 0000000..fce4ddd
--- /dev/null
+++ b/packages/ielm.el
@@ -0,0 +1,3 @@
+(use-package ielm
+ :hook
+ (ielm-mode . visual-line-mode))
diff --git a/packages/image-dired.el b/packages/image-dired.el
new file mode 100644
index 0000000..c81e7a3
--- /dev/null
+++ b/packages/image-dired.el
@@ -0,0 +1,3 @@
+(use-package image-dired
+ :custom
+ (image-dired-dir (file-name-concat (xdg-cache-home) "image-dired")))
diff --git a/packages/magit.el b/packages/magit.el
new file mode 100644
index 0000000..1b052ae
--- /dev/null
+++ b/packages/magit.el
@@ -0,0 +1,3 @@
+(use-package magit
+ :commands magit
+ :custom (magit-inhibit-libgit t))
diff --git a/packages/man.el b/packages/man.el
new file mode 100644
index 0000000..68c2766
--- /dev/null
+++ b/packages/man.el
@@ -0,0 +1,3 @@
+(use-package man
+ :custom
+ (Man-notify-method 'pushy))
diff --git a/packages/nasm-mode.el b/packages/nasm-mode.el
new file mode 100644
index 0000000..d30f5ed
--- /dev/null
+++ b/packages/nasm-mode.el
@@ -0,0 +1,3 @@
+(use-package nasm-mode
+ :config
+ (advice-add 'nasm-comment :around (lambda (&rest _) (insert ";"))))
diff --git a/packages/pixel-scroll.el b/packages/pixel-scroll.el
new file mode 100644
index 0000000..a682571
--- /dev/null
+++ b/packages/pixel-scroll.el
@@ -0,0 +1,8 @@
+(use-package pixel-scroll
+ :if (and (locate-library "pixel-scroll")
+ (display-graphic-p))
+ :custom
+ (pixel-dead-time 0)
+ (pixel-wait 0)
+ (pixel-resolution-fine-flag 10))
+
diff --git a/packages/prog-mode.el b/packages/prog-mode.el
new file mode 100644
index 0000000..3da5cfd
--- /dev/null
+++ b/packages/prog-mode.el
@@ -0,0 +1,9 @@
+(use-package prog-mode
+ :hook
+ (prog-mode . visual-line-mode)
+ (prog-mode . display-line-numbers-mode)
+ (prog-mode . electric-pair-mode)
+ (prog-mode . electric-indent-mode)
+ (prog-mode . (lambda ()
+ (when (featurep 'highlight-indentation)
+ (highlight-indentation-mode 1)))))
diff --git a/packages/recentf.el b/packages/recentf.el
new file mode 100644
index 0000000..d548149
--- /dev/null
+++ b/packages/recentf.el
@@ -0,0 +1,3 @@
+(use-package recentf
+ :custom
+ (recentf-save-file (file-name-concat (xdg-state-home) "emacs/recentf")))
diff --git a/packages/savehist.el b/packages/savehist.el
new file mode 100644
index 0000000..71a032e
--- /dev/null
+++ b/packages/savehist.el
@@ -0,0 +1,4 @@
+(use-package savehist
+ :custom
+ (savehist-file (file-name-concat (xdg-state-home) "emacs/savehist"))
+ (savehist-save-minibuffer-history t))
diff --git a/packages/saveplace.el b/packages/saveplace.el
new file mode 100644
index 0000000..cfe0a21
--- /dev/null
+++ b/packages/saveplace.el
@@ -0,0 +1,4 @@
+(use-package saveplace
+ :custom
+ (save-place-file (file-name-concat (xdg-state-home) "saveplace/places"))
+ (save-place-limit nil))
diff --git a/packages/sh-script.el b/packages/sh-script.el
new file mode 100644
index 0000000..9ac8cca
--- /dev/null
+++ b/packages/sh-script.el
@@ -0,0 +1,3 @@
+(use-package sh-script
+ :custom
+ (sh-indent-statement-after-and nil))
diff --git a/packages/text-mode.el b/packages/text-mode.el
new file mode 100644
index 0000000..b281d95
--- /dev/null
+++ b/packages/text-mode.el
@@ -0,0 +1,4 @@
+(use-package text-mode
+ :hook
+ (text-mode . display-line-numbers-mode)
+ (text-mode . visual-line-mode))
diff --git a/packages/tramp.el b/packages/tramp.el
new file mode 100644
index 0000000..5af23df
--- /dev/null
+++ b/packages/tramp.el
@@ -0,0 +1,8 @@
+(use-package tramp
+ :custom
+ (tramp-password-cache nil)
+ (tramp-persistency-file-name (file-name-concat (xdg-state-home) "emacs/tramp/persistency-file"))
+ :config
+ (add-to-list 'tramp-connection-properties
+ (list (regexp-quote (format "/sudo:root@%s:" system-name))
+ "session-timeout" (* 60 60))))
diff --git a/packages/transient.el b/packages/transient.el
new file mode 100644
index 0000000..7e6690a
--- /dev/null
+++ b/packages/transient.el
@@ -0,0 +1,5 @@
+(use-package transient
+ :custom
+ (transient-levels-file (file-name-concat (xdg-state-home) "emacs/transient/levels.el"))
+ (transient-values-file (file-name-concat (xdg-state-home) "emacs/transient/values.el"))
+ (transient-history-file (file-name-concat (xdg-state-home) "emacs/transient/history.el")))
diff --git a/packages/treesit.el b/packages/treesit.el
new file mode 100644
index 0000000..0ba4a14
--- /dev/null
+++ b/packages/treesit.el
@@ -0,0 +1,36 @@
+(use-package treesit
+ :if (ignore-errors (treesit-available-p))
+ :config
+ (let ((setup-treesit-mode (lambda (parser treesit-mode modes &optional interpreters)
+ (if (not (treesit-language-available-p parser))
+ (message "treesit language parser not available for %s"
+ (symbol-name language))
+ (seq-each (lambda (mode)
+ (add-to-list 'auto-mode-alist
+ (cons (rx (literal ".")
+ (literal mode) eos)
+ treesit-mode)))
+ modes)
+ (seq-each (lambda (interpreter)
+ (add-to-list 'interpreter-mode-alist
+ (cons interpreter treesit-mode)))
+ interpreters)))))
+ (funcall setup-treesit-mode 'python 'python-ts-mode '("py") '("python" "python3"))
+ (funcall setup-treesit-mode 'bash 'bash-ts-mode '("sh") '("bash" "sh" "openrc-run"))
+ (funcall setup-treesit-mode 'rust 'rust-ts-mode '("rs"))
+ (funcall setup-treesit-mode 'cpp 'c++-ts-mode '("cpp" "cxx" "c++" "hpp" "hxx" "h++"))))
+
+(use-package rust-ts-mode
+ :requires treesit
+ :hook
+ (rust-ts-mode . (lambda ()
+ (when (require 'rust-mode nil t)
+ (add-hook 'before-save-hook 'rust-before-save-method nil t)
+ (add-hook 'after-save-hook 'rust-after-save-method nil t)
+ (use-local-map (make-composed-keymap (list rust-ts-mode-map rust-mode-map)))))))
+
+(use-package c-ts-mode
+ :requires treesit
+ :custom
+ (c-ts-mode-indent-style 'linux)
+ (c-ts-mode-indent-offset 2))
diff --git a/themes/badger-theme.el b/themes/badger-theme.el
new file mode 100644
index 0000000..41102ed
--- /dev/null
+++ b/themes/badger-theme.el
@@ -0,0 +1,12 @@
+(require-theme 'wombat-theme)
+
+(deftheme badger)
+
+(custom-theme-set-faces
+ 'badger
+ `(fringe ((t (:foreground ,(face-foreground 'default) :background ,(face-background 'default)))))
+ '(elisp-shorthand-font-lock-face ((t (:foreground "dark cyan"))))
+ '(line-number-current-line ((t (:background "gray"))))
+ '(highlight-indentation-face ((t (:background "gray20")))))
+
+(provide-theme 'badger)