8 Commits

Author SHA1 Message Date
Joe Frikker b7912eef52 Redbook 2026-06-19 18:38:22 -04:00
Joe Frikker ed88afe698 wip 2026-06-19 18:33:43 -04:00
Joe Frikker e52adbbc4b Splitting out shibumi deps 2026-06-17 15:42:52 -04:00
Joe Frikker db1b86cbd7 evil 2026-06-12 22:44:14 -04:00
Joe Frikker 74dc6fd742 wip 2026-06-05 21:09:53 -04:00
Joe Frikker 591f00e2f9 wip 2026-06-02 16:44:33 -04:00
Joe Frikker 9e653100f2 wip 2026-05-28 23:19:00 -04:00
Joe Frikker 96e6fc7706 Bumping nixpkgs and removing unused treesitter parsers 2026-05-19 15:55:45 -04:00
3 changed files with 198 additions and 96 deletions
Generated
+9 -9
View File
@@ -25,11 +25,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1775762219, "lastModified": 1779969295,
"narHash": "sha256-e7BhggoWhg3Ok7dDI5kY1XZzORBQc0Rclcs3IWzux3w=", "narHash": "sha256-HwIJ3tOcwSMiV75L7KqJXciXR9UfT+d7rwOZMX7cTnA=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "c975a66a56306b38eaa3108f54bbc11e213f42f6", "rev": "61e2c9659324181e0f0ed911958c536333b1d4f6",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -65,11 +65,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1775365369, "lastModified": 1779604987,
"narHash": "sha256-DgH5mveLoau20CuTnaU5RXZWgFQWn56onQ4Du2CqYoI=", "narHash": "sha256-ZQ5z+fVhxYKtIFwtqGp5O0PD84BM1riASvqDaN5Xs+s=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-index-database", "repo": "nix-index-database",
"rev": "cef5cf82671e749ac87d69aadecbb75967e6f6c3", "rev": "8fba98c80b48fa013820e0163c5096922fea4ddd",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -80,11 +80,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1775423009, "lastModified": 1779560665,
"narHash": "sha256-vPKLpjhIVWdDrfiUM8atW6YkIggCEKdSAlJPzzhkQlw=", "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "68d8aa3d661f0e6bd5862291b5bb263b2a6595c9", "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github" "type": "github"
}, },
"original": { "original": {
+4 -6
View File
@@ -50,13 +50,11 @@
modules = modules =
[ [
nix-index-database.homeModules.default nix-index-database.homeModules.default
"${modules}/base.nix"
"${modules}/desktop.nix"
"${modules}/shibumi.nix"
"${modules}/shibumi-desktop.nix"
] ++ ] ++
(pkgs.lib.filter
(n: pkgs.lib.strings.hasSuffix ".nix" n)
(pkgs.lib.filesystem.listFilesRecursive "${modules}/base")) ++
(pkgs.lib.filter
(n: pkgs.lib.strings.hasSuffix ".nix" n)
(pkgs.lib.filesystem.listFilesRecursive "${modules}/desktop")) ++
[{ [{
home.stateVersion = "22.05"; home.stateVersion = "22.05";
home.username = "jfrikker"; home.username = "jfrikker";
+185 -81
View File
@@ -1,5 +1,38 @@
#+PROPERTY: header-args :mkdirp yes #+PROPERTY: header-args :mkdirp yes
#+PROPERTY: header-args:elisp :lexical t #+PROPERTY: header-args:elisp :lexical t
* Categories
#+BEGIN_SRC nix :tangle target/base.nix
{lib, ...}: {
imports = lib.filter
(n: lib.strings.hasSuffix ".nix" n)
(lib.filesystem.listFilesRecursive ./base);
}
#+END_SRC
#+BEGIN_SRC nix :tangle target/desktop.nix
{lib, ...}: {
imports = lib.filter
(n: lib.strings.hasSuffix ".nix" n)
(lib.filesystem.listFilesRecursive ./desktop);
}
#+END_SRC
#+BEGIN_SRC nix :tangle target/redbook.nix
{lib, ...}: {
imports = lib.filter
(n: lib.strings.hasSuffix ".nix" n)
(lib.filesystem.listFilesRecursive ./redbook);
}
#+END_SRC
#+BEGIN_SRC nix :tangle target/redbook-desktop.nix
{lib, ...}: {
imports = lib.filter
(n: lib.strings.hasSuffix ".nix" n)
(lib.filesystem.listFilesRecursive ./redbook-desktop);
}
#+END_SRC
* Packages * Packages
Home-manager "packages" are simply binaries that are placed on the path, without any attached Home-manager "packages" are simply binaries that are placed on the path, without any attached
@@ -90,6 +123,7 @@ tools. They boost better speed, or simply more streamlined features.
dust dust
fd fd
ripgrep ripgrep
tokei
xh xh
]; ];
} }
@@ -131,9 +165,9 @@ between them. Once installed, the actual command is ~wormhole~.
#+end_src #+end_src
These are the other programs I have installed globally. A few (like ~awscli~, ~mysql-client~, etc.) These are the other programs I have installed globally. A few (like ~awscli~, ~mysql-client~, etc.)
are still Shibumi-specific; ideally I'd find another way to install them. are still Redbook-specific; ideally I'd find another way to install them.
#+BEGIN_SRC nix :tangle target/base/other-packages.nix #+BEGIN_SRC nix :tangle target/redbook/other-packages.nix
{pkgs, kube, ...}: {pkgs, kube, ...}:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
@@ -142,9 +176,7 @@ are still Shibumi-specific; ideally I'd find another way to install them.
kube kube
kubectl kubectl
mariadb.client mariadb.client
nerd-fonts.jetbrains-mono
openssh openssh
tokei
]; ];
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
@@ -158,17 +190,26 @@ These programs require a full desktop environment:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
google-chrome google-chrome
nerd-fonts.jetbrains-mono
(iosevka-bin.override { variant = "Aile"; }) (iosevka-bin.override { variant = "Aile"; })
(iosevka-bin.override { variant = "Etoile"; }) (iosevka-bin.override { variant = "Etoile"; })
(iosevka-bin.override { variant = "SGr-IosevkaTerm"; }) (iosevka-bin.override { variant = "SGr-IosevkaTerm"; })
keymapp keymapp
proton-pass proton-pass
slack
wireshark wireshark
]; ];
} }
#+END_SRC #+END_SRC
#+BEGIN_SRC nix :tangle target/redbook-desktop/desktop-packages.nix
{pkgs, ...}:
{
home.packages = with pkgs; [
slack
];
}
#+END_SRC
* Program Configurations * Program Configurations
This section contains applications whose config files will be generated by Home Manager. Home This section contains applications whose config files will be generated by Home Manager. Home
Manager calls these "programs" (as opposed to "packages", which are just binaries to put on the Manager calls these "programs" (as opposed to "packages", which are just binaries to put on the
@@ -272,7 +313,7 @@ We all know what ~git~ does.
programs.git = { programs.git = {
enable = true; enable = true;
settings.user.name = "Joe Frikker"; settings.user.name = "Joe Frikker";
settings.user.email = "joe.frikker@shibumi.com"; settings.user.email = "joe@redbookcattle.com";
}; };
programs.delta = { programs.delta = {
@@ -872,13 +913,15 @@ Use variable-width fonts in text buffers. ~mixed-pitch-mode~ keeps most code blo
(add-hook 'yaml-ts-mode-hook 'no-mixed-pitch) (add-hook 'yaml-ts-mode-hook 'no-mixed-pitch)
(add-hook 'mhtml-mode 'no-mixed-pitch) (add-hook 'mhtml-mode 'no-mixed-pitch)
(add-hook 'nxml-mode 'no-mixed-pitch)
#+END_SRC #+END_SRC
A basic ace-window setup. Allows switching between windows quickly (although avy can do the same...). A basic ace-window setup. Allows switching between windows quickly (although avy can do the same...).
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(bind-keys ("M-o" . ace-window) (bind-keys ("M-o" . ace-window)
("s-o" . ace-window)) ("s-o" . ace-window)
("C-c o" . ace-window))
(setopt aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)) (setopt aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l))
(setopt aw-dispatch-always t) (setopt aw-dispatch-always t)
#+END_SRC #+END_SRC
@@ -889,7 +932,7 @@ Set up a few project- / workspace-related key bindings.
(bind-keys ("s-f" . project-find-file) (bind-keys ("s-f" . project-find-file)
("s-F" . project-switch-project)) ("s-F" . project-switch-project))
(with-eval-after-load tab-bar-mode (with-eval-after-load 'tab-bar
(bind-keys :map tab-bar-mode-map (bind-keys :map tab-bar-mode-map
("s-s" . tab-bar-switch-to-tab))) ("s-s" . tab-bar-switch-to-tab)))
#+END_SRC #+END_SRC
@@ -910,7 +953,7 @@ less so?
I'm trying this out. This disables visual selections. It's bold, which is why I like it :) I'm trying this out. This disables visual selections. It's bold, which is why I like it :)
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(transient-mark-mode -1) ;; (transient-mark-mode -1)
#+END_SRC #+END_SRC
I use tabs to manage multiple "workspaces". I don't tie a project to a tab or anything; often fixing I use tabs to manage multiple "workspaces". I don't tie a project to a tab or anything; often fixing
@@ -1008,7 +1051,9 @@ This configuration affects general text editing, across all modes. First, some p
avy avy
edit-indirect edit-indirect
embark embark
god-mode evil
evil-collection
evil-org
string-inflection string-inflection
]; ];
extraConfig = builtins.readFile ./emacs-editing.el; extraConfig = builtins.readFile ./emacs-editing.el;
@@ -1027,40 +1072,18 @@ but I'm worried that having too many repeat maps will also be annoying (I'll hav
cancel them more frequently). In the end, I opted for Devil mode. It avoids modifier keys, and has cancel them more frequently). In the end, I opted for Devil mode. It avoids modifier keys, and has
its own devil-mode-only repeat maps that don't interfere when using normal modifier key sequences. its own devil-mode-only repeat maps that don't interfere when using normal modifier key sequences.
#+BEGIN_SRC elisp :tangle nil #+BEGIN_SRC elisp
(use-package devil (setopt evil-want-keybinding nil)
:disable t (require 'evil)
:config (evil-mode 1)
(global-devil-mode) (require 'evil-collection)
(setq devil-repeatable-keys (evil-collection-init)
'(("%k /")
("%k d")
("%k k")
("%k m ^")
("%k m b" "%k m f" "%k m a" "% k m e")
("%k m @" "%k m h")
("%k m y")
("%k p" "%k n" "%k b" "%k f" "%k a" "%k e")
("%k s")
("%k m d" "%k m <backspace>"))))
#+END_SRC
#+BEGIN_SRC elisp (require 'evil-org)
(require 'god-mode) (add-hook 'org-mode-hook 'evil-org-mode)
(require 'which-key) (evil-org-set-key-theme '(navigation insert textobjects additional calendar))
(require 'evil-org-agenda)
(bind-keys :map god-local-mode-map (evil-org-agenda-set-keys)
("i" . (lambda () (interactive) (god-mode-all -1)))
("z" . repeat))
(bind-keys ("<escape>" . (lambda () (interactive) (god-mode-all 1))))
(defun my-god-mode-update-cursor-type ()
(setq cursor-type (cond
(org-present-mode nil)
((or god-local-mode buffer-read-only) 'box)
(t 'bar))))
(add-hook 'post-command-hook 'my-god-mode-update-cursor-type)
(which-key-enable-god-mode-support)
#+END_SRC #+END_SRC
Avy allows jumping to any place on the screen with just a few keystrokes. I've stolen most of these Avy allows jumping to any place on the screen with just a few keystrokes. I've stolen most of these
@@ -1083,6 +1106,7 @@ his article.
(bind-keys (bind-keys
("M-j" . avy-goto-char-timer) ("M-j" . avy-goto-char-timer)
("C-c j" . avy-goto-char-timer)
("M-J" . avy-goto-char-timer-embark) ("M-J" . avy-goto-char-timer-embark)
("C-." . embark-act)) ("C-." . embark-act))
#+END_SRC #+END_SRC
@@ -1131,7 +1155,13 @@ Just "silently" wrap when searching at the bottom of a document.
haskell-ts-mode haskell-ts-mode
jenkinsfile-mode jenkinsfile-mode
jq-mode jq-mode
lispy (lispy.overrideAttrs {
packageRequires = [
ace-window iedit swiper zoutline
];
ignoreCompilationError = true;
})
lispyville
lua-mode lua-mode
nix-mode nix-mode
rust-mode rust-mode
@@ -1139,7 +1169,42 @@ Just "silently" wrap when searching at the bottom of a document.
sly-macrostep sly-macrostep
sql-indent sql-indent
tree-sitter tree-sitter
treesit-grammars.with-all-grammars (treesit-grammars.with-grammars (g: [
g.tree-sitter-bash
g.tree-sitter-commonlisp
g.tree-sitter-css
g.tree-sitter-dockerfile
g.tree-sitter-dot
g.tree-sitter-elisp
g.tree-sitter-graphql
g.tree-sitter-gitcommit
g.tree-sitter-gitignore
g.tree-sitter-haskell
g.tree-sitter-html
g.tree-sitter-java
g.tree-sitter-javascript
g.tree-sitter-jq
g.tree-sitter-json
g.tree-sitter-json5
g.tree-sitter-just
g.tree-sitter-ledger
g.tree-sitter-llvm
g.tree-sitter-make
g.tree-sitter-nginx
g.tree-sitter-nix
g.tree-sitter-org
g.tree-sitter-php
g.tree-sitter-python
g.tree-sitter-rust
g.tree-sitter-rust-format-args
g.tree-sitter-scss
g.tree-sitter-sql
g.tree-sitter-toml
g.tree-sitter-tsx
g.tree-sitter-typescript
g.tree-sitter-xml
g.tree-sitter-yaml
]))
yaml-pro yaml-pro
]; ];
extraConfig = builtins.readFile ./emacs-languages.el; extraConfig = builtins.readFile ./emacs-languages.el;
@@ -1147,17 +1212,37 @@ Just "silently" wrap when searching at the bottom of a document.
} }
#+END_SRC #+END_SRC
#+BEGIN_SRC elisp
(electric-pair-mode 1)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(global-tree-sitter-mode 1)
(setopt ediff-split-window-function 'split-window-horizontally)
(defun project-nix-flake ()
(interactive)
(nix-flake (project-root (project-current t))))
(bind-keys ("C-x p n" . project-nix-flake))
#+END_SRC
Show a vertical bar 100 characters out; ideally I don't want lines longer than this. 100 characters
is about the max you can have and still fit two files side-by-side on the screen.
#+begin_src elisp
(setq-default fill-column 100)
(defun jf-init-fill-column ()
(display-fill-column-indicator-mode 1))
(add-hook 'prog-mode-hook 'jf-init-fill-column)
#+end_src
I had some weird problems with jsx code where the default M-q would just do a text fill rather than I had some weird problems with jsx code where the default M-q would just do a text fill rather than
a re-indent. The solution seems to be to only do the ~syntax-ppss~ stuff if tree-sitter isn't a re-indent. The solution seems to be to only do the ~syntax-ppss~ stuff if tree-sitter isn't
available? It seems to work for now anyway... available? It seems to work for now anyway...
#+BEGIN_SRC elisp #+begin_src elisp
(electric-pair-mode 1)
(autoload 'flymake-show-project-diagnostics "flymake")
(autoload 'flymake-goto-next-error "flymake")
(autoload 'flymake-goto-prev-error "flymake")
(with-eval-after-load 'prog-mode (with-eval-after-load 'prog-mode
(defun my-prog-fill-reindent-defun (&optional argument) (defun my-prog-fill-reindent-defun (&optional argument)
"Refill or reindent the paragraph or defun that contains point. "Refill or reindent the paragraph or defun that contains point.
@@ -1183,42 +1268,52 @@ available? It seems to work for now anyway...
(end-of-defun) (end-of-defun)
(indent-region start (point) nil)))))) (indent-region start (point) nil))))))
(advice-add 'prog-fill-reindent-defun :override #'my-prog-fill-reindent-defun) (advice-add 'prog-fill-reindent-defun :override #'my-prog-fill-reindent-defun))
#+end_src
*** Flymake
#+begin_src elisp
(autoload 'flymake-show-project-diagnostics "flymake")
(autoload 'flymake-goto-next-error "flymake")
(autoload 'flymake-goto-prev-error "flymake")
(with-eval-after-load 'prog-mode
(bind-keys :map prog-mode-map (bind-keys :map prog-mode-map
("C-c D" . flymake-show-project-diagnostics) ("C-c D" . flymake-show-project-diagnostics)
("M-n" . flymake-goto-next-error) ("M-n" . flymake-goto-next-error)
("M-p" . flymake-goto-prev-error)) ("M-p" . flymake-goto-prev-error)))
(defun jf-init-fill-column ()
(display-fill-column-indicator-mode 1))
(add-hook 'prog-mode-hook 'jf-init-fill-column))
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(global-tree-sitter-mode 1)
(setq-default fill-column 100)
(setopt eglot-ignored-server-capabilities '(:inlayHintProvider :semanticTokensProvider))
(add-hook 'eglot-managed-mode-hook (lambda () (eglot-inlay-hints-mode -1)) nil t)
(setopt eglot-code-action-indications nil)
(with-eval-after-load 'eglot
(bind-keys :map eglot-mode-map
("C-c a" . eglot-code-actions)
("C-c r" . eglot-rename)
("C-c i" . eglot-find-implementation))
(add-to-list 'eglot-stay-out-of 'yasnippet))
(setopt ediff-split-window-function 'split-window-horizontally)
(defun project-nix-flake ()
(interactive)
(nix-flake (project-root (project-current t))))
(bind-keys ("C-x p n" . project-nix-flake))
(with-eval-after-load 'flymake (with-eval-after-load 'flymake
(bind-keys :map flymake-project-diagnostics-mode-map (bind-keys :map flymake-project-diagnostics-mode-map
("q" . quit-window))) ("q" . quit-window)))
#+END_SRC #+end_src
*** Eglot
I don't like UI elements that insert fake text into the file. They mess up the spacing in the file, and can make everything too wide.
#+BEGIN_SRC elisp
(setopt eglot-ignored-server-capabilities '(:inlayHintProvider :semanticTokensProvider))
(add-hook 'eglot-managed-mode-hook (lambda () (eglot-inlay-hints-mode -1)) nil t)
(setopt eglot-code-action-indications nil)
#+END_SRC
Set up a few useful eglot keys.
#+begin_src elisp
(with-eval-after-load 'eglot
(bind-keys :map eglot-mode-map
("C-c a" . eglot-code-actions)
("C-c r" . eglot-rename)
("C-c i" . eglot-find-implementation)))
#+end_src
Eglot's yasnippet support uses the tab key, but I *also* use the tab key both for indentation, and
for completion. That makes it really annoying to use; don't use yasnippet with eglot.
#+begin_src elisp
(with-eval-after-load 'eglot
(add-to-list 'eglot-stay-out-of 'yasnippet))
#+end_src
*** Rust *** Rust
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
@@ -1248,6 +1343,8 @@ available? It seems to work for now anyway...
(add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1))) (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1)))
(add-hook 'lisp-mode-hook (lambda () (lispy-mode 1))) (add-hook 'lisp-mode-hook (lambda () (lispy-mode 1)))
(with-eval-after-load 'lispy (with-eval-after-load 'lispy
(require 'lispyville)
(add-hook 'lispy-mode-hook #'lispyville-mode)
(bind-keys :map lispy-mode-map (bind-keys :map lispy-mode-map
("i" . (lambda () ("i" . (lambda ()
(interactive) (interactive)
@@ -1258,6 +1355,10 @@ available? It seems to work for now anyway...
*** Typescript *** Typescript
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(push '("\\.ts\\'" . typescript-mode) auto-mode-alist)
(push '(typescript-mode . typescript-ts-mode) major-mode-remap-alist)
(push '("\\.tsx\\'" . tsx-mode) auto-mode-alist)
(push '(tsx-mode . tsx-ts-mode) major-mode-remap-alist)
(setopt typescript-ts-mode-indent-offset 4) (setopt typescript-ts-mode-indent-offset 4)
(with-eval-after-load 'typescript-ts-mode (with-eval-after-load 'typescript-ts-mode
(defun my-tsx-ts-mode--indent-compatibility-b893426 () (defun my-tsx-ts-mode--indent-compatibility-b893426 ()
@@ -1276,6 +1377,7 @@ available? It seems to work for now anyway...
*** Java *** Java
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(push '(java-mode . java-ts-mode) major-mode-remap-alist)
(with-eval-after-load 'java-ts-mode (with-eval-after-load 'java-ts-mode
(bind-keys :map java-ts-mode-map (bind-keys :map java-ts-mode-map
("C-c u" . string-inflection-java-style-cycle)) ("C-c u" . string-inflection-java-style-cycle))
@@ -1363,6 +1465,7 @@ available? It seems to work for now anyway...
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(setopt magit-define-global-key-bindings 'recommended) (setopt magit-define-global-key-bindings 'recommended)
(bind-keys ("s-g" . magit))
(setopt magit-save-repository-buffers 'dontask) (setopt magit-save-repository-buffers 'dontask)
(setopt magit-commit-show-diff nil) (setopt magit-commit-show-diff nil)
@@ -1756,7 +1859,8 @@ available? It seems to work for now anyway...
#+END_SRC #+END_SRC
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(global-set-key (kbd "C-c c") claude-code-command-map) (require 'claude-code)
(keymap-global-set "C-c c" claude-code-command-map)
#+END_SRC #+END_SRC
* Theme * Theme
I like Catppuccin Frappe as my theme. Let's use it in as many places as we can. I like Catppuccin Frappe as my theme. Let's use it in as many places as we can.