use-package / more prose

This commit is contained in:
Joe Frikker
2026-09-17 10:37:14 -04:00
parent afbe54d983
commit 948c150a06
+244 -178
View File
@@ -89,8 +89,6 @@ using a dialog, rather than a command line prompt.
#+BEGIN_SRC nix
{
home.packages = with pkgs; [
rage
age-plugin-yubikey
yubikey-manager
];
}
@@ -158,8 +156,6 @@ are still Redbook-specific; ideally I'd find another way to install them.
home.packages = with pkgs; [
openssh
];
fonts.fontconfig.enable = true;
})
#+END_SRC
@@ -179,14 +175,24 @@ These programs require a full desktop environment:
proton-pass
wireshark
];
fonts.fontconfig.enable = true;
})
#+END_SRC
#+BEGIN_SRC nix
(mkIf (cfg.redbook.enable && cfg.desktop.enable) {
home.packages = with pkgs; [
linear
notion-app
teams
];
})
#+END_SRC
** Slack
#+BEGIN_SRC nix
(mkIf (cfg.redbook.enable && cfg.desktop.enable) {
home.packages = with pkgs; [
(slack.overrideAttrs {
version = "4.50.143";
src = pkgs.fetchurl {
@@ -194,11 +200,31 @@ These programs require a full desktop environment:
hash = "sha256-f5oYi8NPKXWpDcowFYMUjptbQs4V9hK2bm1TuaQeJn0=";
};
})
teams
];
programs.emacs = {
extraPackages = epkgs: with epkgs; [
ox-slack
slack
];
extraConfig = builtins.readFile ./slack.el;
};
})
#+END_SRC
#+BEGIN_SRC elisp :tangle target/slack.el
(use-package lui
:defer t
:custom
(lui-time-stamp-format "[%Y-%m-%d %H:%M]"))
(use-package slack
:commands slack-start
:custom
(slack-render-profile-images-p nil)
(slack-buffer-function #'switch-to-buffer))
#+END_SRC
* Program Configurations
:PROPERTIES:
:header-args:nix: :noweb-ref nix-configs
@@ -408,7 +434,6 @@ shows what's changing when you update your config, which is nice.
}
#+END_SRC
** Starship
~starship~ gives me a nice shell prompt, mostly showing the versions of relevant software I have
@@ -776,15 +801,72 @@ Actually, nix *really* requires ~bash~. This is a plugin that allows using zsh f
#+END_SRC
** Claude Code
:PROPERTIES:
:header-args:elisp: :tangle target/emacs.el
:END:
#+BEGIN_SRC nix
{
programs.claude-code = {
enable = true;
};
programs.emacs = {
extraPackages = epkgs: with epkgs; [
(epkgs.trivialBuild {
pname = "claude-code";
version = "0.4.5";
src = pkgs.fetchFromGitHub {
owner = "stevemolitor";
repo = "claude-code.el";
rev = "03199df8b3a1e9cd4857f0851f7a912ba524aff3";
sha256 = "sha256-5QJrWIu4EgnHcOqMwlrs2JBBx7aI9OaSJswesr6Apfk=";
};
packageRequires = [ epkgs.inheritenv ];
})
];
};
}
#+END_SRC
#+BEGIN_SRC elisp
(use-package claude-code
:bind-keymap ("C-c c" . claude-code-command-map)
:custom (claude-code-optimize-window-resize nil))
#+END_SRC
** Age
:PROPERTIES:
:header-args:elisp: :tangle target/emacs.el
:END:
#+BEGIN_SRC nix
{
home.sessionVariables = {
PINENTRY_PROGRAM = "pinentry-mac";
};
home.packages = with pkgs; [
rage
age-plugin-yubikey
];
programs.emacs = {
extraPackages = epkgs: with epkgs; [
age
];
};
}
#+END_SRC
#+BEGIN_SRC elisp
(use-package age
:hook (after-init . age-file-enable)
:custom
(age-default-identity "~/source/dotfiles/keys/yubi1age.txt")
(age-default-recipient "~/source/dotfiles/keys/myself.txt"))
#+END_SRC
* Emacs
:PROPERTIES:
:header-args:nix: :noweb-ref nix-configs
@@ -1980,7 +2062,6 @@ for completion. That makes it really annoying to use; don't use yasnippet with e
org-modern
org-present
org-roam
ox-slack
verb
visual-fill-column
];
@@ -1989,105 +2070,48 @@ for completion. That makes it really annoying to use; don't use yasnippet with e
#+END_SRC
#+BEGIN_SRC elisp
(require 'org)
(use-package org
:bind (("C-c A" . org-agenda)
("C-c C" . org-capture)
("C-c l" . org-id-store-link))
:custom
(org-babel-load-languages '((emacs-lisp . t) (sql . t)))
(org-confirm-babel-evaluate nil)
(org-link-keep-stored-after-insertion t)
(org-capture-templates
'(("t" "Todo" entry
(here)
"** TODO %?\n:LOGBOOK:\n- State \"TODO\" %U\n:END:\n")
("w" "Work stuff")
("wp" "Work Project" entry
(file+headline "~/org/todo/work.org.age" "Next Actions")
"*** PROJ %?\n- State \"PROJ\" %U\n")
("wa" "Work Next Action" entry
(file+headline "~/org/todo/work.org.age" "Next Actions")
"*** TODO %?\n- State \"TODO\" %U\n")
("p" "Personal stuff")
("pp" "Personal Project" entry
(file+headline "~/org/todo/personal.org.age" "Next Actions")
"*** PROJ %?\n- State \"PROJ\" %U\n")
("pa" "Personal Next Action" entry
(file+headline "~/org/todo/personal.org.age" "Next Actions")
"*** TODO %?\n- State \"TODO\" %U\n")))
(org-agenda-files '("~/org/todo/work.org" "~/org/todo/personal.org.age"))
(org-agenda-todo-ignore-scheduled 'future)
(org-agenda-tags-todo-honor-ignore-options t)
(org-enforce-todo-dependencies t)
(org-agenda-dim-blocked-tasks 'invisible)
:config
(add-hook 'org-mode-hook 'visual-line-mode)
(set-face-attribute 'org-level-1 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-2 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-3 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-4 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-5 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-6 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-7 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-8 nil :font "Iosevka Aile"))
(bind-keys ("C-c A" . org-agenda)
("C-c C" . org-capture)
("C-c l" . org-id-store-link))
(setopt org-babel-load-languages '((emacs-lisp . t) (sql . t)))
(setopt org-confirm-babel-evaluate nil)
(add-hook 'org-mode-hook 'visual-line-mode)
(setopt org-link-keep-stored-after-insertion t
org-capture-templates
'(("t" "Todo" entry
(here)
"** TODO %?\n:LOGBOOK:\n- State \"TODO\" %U\n:END:\n")
("w" "Work stuff")
("wp" "Work Project" entry
(file+headline "~/org/todo/work.org.age" "Next Actions")
"*** PROJ %?\n- State \"PROJ\" %U\n")
("wa" "Work Next Action" entry
(file+headline "~/org/todo/work.org.age" "Next Actions")
"*** TODO %?\n- State \"TODO\" %U\n")
("p" "Personal stuff")
("pp" "Personal Project" entry
(file+headline "~/org/todo/personal.org.age" "Next Actions")
"*** PROJ %?\n- State \"PROJ\" %U\n")
("pa" "Personal Next Action" entry
(file+headline "~/org/todo/personal.org.age" "Next Actions")
"*** TODO %?\n- State \"TODO\" %U\n"))
org-agenda-files '("~/org/todo/work.org" "~/org/todo/personal.org.age")
org-agenda-todo-ignore-scheduled 'future
org-agenda-tags-todo-honor-ignore-options t
org-enforce-todo-dependencies t
org-agenda-dim-blocked-tasks 'invisible)
(set-face-attribute 'org-level-1 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-2 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-3 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-4 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-5 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-6 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-7 nil :font "Iosevka Aile")
(set-face-attribute 'org-level-8 nil :font "Iosevka Aile")
(defvar-local my/org-present-face-remapping-cookies nil)
(with-eval-after-load 'org-present
(require 'face-remap)
(require 'visual-fill-column)
(defun my/org-present-start ()
(setq-local my/org-present-face-remapping-cookies nil)
;; Tweak font sizes
(dolist (face '((default :height 2.0)
(header-line :height 4.0 :background "#303446")
(org-document-title :height 1.75)
(org-code :height 2.0)
(org-verbatim :height 2.0)
(org-block :height 1.25)
(org-block-begin-line :height 0.7)
(org-level-1 :height 3.0)
(org-level-2 :height 3.0)
(org-level-3 :height 3.0)
(org-level-4 :height 3.0)
(org-level-5 :height 3.0)
(org-level-6 :height 3.0)
(org-level-7 :height 3.0)
(org-level-8 :height 3.0)))
(push (apply #'face-remap-add-relative face) my/org-present-face-remapping-cookies))
;; Set a blank header line string to create blank space at the top
(setq header-line-format " ")
;; Display inline images automatically
(org-display-inline-images)
(org-present-hide-cursor)
;; Center the presentation and wrap lines
(visual-fill-column-mode 1)
(setq visual-fill-column-center-text t)
;; (visual-line-mode 1)
)
(defun my/org-present-end ()
;; Reset font customizations
(dolist (cookie my/org-present-face-remapping-cookies)
(face-remap-remove-relative cookie))
;; Clear the header line string so that it isn't displayed
(setq header-line-format nil)
;; Stop displaying inline images
(org-remove-inline-images)
(org-present-show-cursor)
;; Stop centering the document
(visual-fill-column-mode 0)
;; (visual-line-mode 0)
)
(add-hook 'org-present-mode-hook 'my/org-present-start)
(add-hook 'org-present-mode-quit-hook 'my/org-present-end))
;; (require 'org-roam)
;; (bind-keys ("C-c n l" . org-roam-buffer-toggle)
@@ -2105,6 +2129,120 @@ for completion. That makes it really annoying to use; don't use yasnippet with e
;; (define-key org-mode-map (kbd "C-c C-r") verb-command-map)
#+END_SRC
*** Presentations
~org-present~ is a cool little package. It lets you give presentations with org mode. Each top-level heading turns into
a slide. When you switch to present mode, ~org-present~ removes all other windows, narrows the buffer to only one
top-level heading at a time, and exposes keys to quickly navigate forward / backward between slides. It also exposes
entry / exit hooks. Those hooks allow you to add custom styling to present mode. For example, you could make all the
text bigger.
#+begin_src elisp
(use-package org-present
:config
(require 'face-remap)
(require 'visual-fill-column)
(defun my/org-present-start ()
<<emacs-org-present-start>>
)
(defun my/org-present-end ()
<<emacs-org-present-end>>
)
(add-hook 'org-present-mode-hook 'my/org-present-start)
(add-hook 'org-present-mode-quit-hook 'my/org-present-end))
#+end_src
Let's customize the window appearance when presenting. First, we'll make fonts larger, by multiplying them by a constant
factor. We'll use ~face-remap~ for that. When ~face-remap~ changes a face, it returns a "cookie" that can be used to restore the face to its old size. We'll store those cookies in a buffer-local variable.
#+begin_src elisp
(defvar-local my/org-present-face-remapping-cookies nil)
#+end_src
When we enter present mode, we'll enlarge the fonts.
#+begin_src elisp :noweb-ref emacs-org-present-start
(setq-local my/org-present-face-remapping-cookies nil)
(dolist (face '((default :height 2.0)
(header-line :height 4.0 :background "#303446")
(org-document-title :height 1.75)
(org-code :height 2.0)
(org-verbatim :height 2.0)
(org-block :height 1.25)
(org-block-begin-line :height 0.7)
(org-level-1 :height 3.0)
(org-level-2 :height 3.0)
(org-level-3 :height 3.0)
(org-level-4 :height 3.0)
(org-level-5 :height 3.0)
(org-level-6 :height 3.0)
(org-level-7 :height 3.0)
(org-level-8 :height 3.0)))
(push (apply #'face-remap-add-relative face) my/org-present-face-remapping-cookies))
#+end_src
And when we leave, we'll restore the old faces.
#+begin_src elisp :noweb-ref emacs-org-present-end
(dolist (cookie my/org-present-face-remapping-cookies)
(face-remap-remove-relative cookie))
#+end_src
Let's add some empty space at the top as a margin. This is kind of a hack, but :shrug:.
#+begin_src elisp :noweb-ref emacs-org-present-start
(setq header-line-format " ")
#+end_src
And we'll clean it up when we're done.
#+begin_src elisp :noweb-ref emacs-org-present-end
(setq header-line-format nil)
#+end_src
To make this look more like a "real" presentation, we want to center the text in the window. We'll use
~visual-fill-column~ to do that. It does two things:
1. Causes text to wrap, like ~visual-line-mode~, but it wraps at the fill column instead of the edge of the window.
2. Centers the text block within the window (based on the fill column).
Let's set it up when we enter present mode:
#+begin_src elisp :noweb-ref emacs-org-present-start
(visual-fill-column-mode 1)
(setq visual-fill-column-center-text t)
#+end_src
And tear it down when we're done:
#+begin_src elisp :noweb-ref emacs-org-present-end
(visual-fill-column-mode 0)
#+end_src
We want to display inline images, of course.
#+begin_src elisp :noweb-ref emacs-org-present-start
(org-display-inline-images)
#+end_src
And stop when we're done.
#+begin_src elisp :noweb-ref emacs-org-present-end
(org-remove-inline-images)
#+end_src
And finally, we want to hide the cursor when presenting.
#+begin_src elisp :noweb-ref emacs-org-present-start
(org-present-hide-cursor)
#+end_src
#+begin_src elisp :noweb-ref emacs-org-present-end
(org-present-show-cursor)
#+end_src
** Terminal
#+BEGIN_SRC nix
{
@@ -2122,30 +2260,6 @@ for completion. That makes it really annoying to use; don't use yasnippet with e
:hook (eshell-load . eat-eshell-mode))
#+END_SRC
** Slack
#+BEGIN_SRC nix
{
programs.emacs = {
extraPackages = epkgs: with epkgs; [
slack
];
};
}
#+END_SRC
#+BEGIN_SRC elisp
(use-package lui
:defer t
:custom
(lui-time-stamp-format "[%Y-%m-%d %H:%M]"))
(use-package slack
:commands slack-start
:custom
(slack-render-profile-images-p nil)
(slack-buffer-function #'switch-to-buffer))
#+END_SRC
** Ledger
#+BEGIN_SRC nix
{
@@ -2156,54 +2270,6 @@ for completion. That makes it really annoying to use; don't use yasnippet with e
};
}
#+END_SRC
** Age
#+BEGIN_SRC nix
{
programs.emacs = {
extraPackages = epkgs: with epkgs; [
age
];
};
}
#+END_SRC
#+BEGIN_SRC elisp
(use-package age
:hook (after-init . age-file-enable)
:custom
(age-default-identity "~/source/dotfiles/keys/yubi1age.txt")
(age-default-recipient "~/source/dotfiles/keys/myself.txt")
:config
(setenv "PINENTRY_PROGRAM" "pinentry-mac")
#+END_SRC
** Claude Code
#+BEGIN_SRC nix
{
programs.emacs = {
extraPackages = epkgs: with epkgs; [
(epkgs.trivialBuild {
pname = "claude-code";
version = "0.4.5";
src = pkgs.fetchFromGitHub {
owner = "stevemolitor";
repo = "claude-code.el";
rev = "03199df8b3a1e9cd4857f0851f7a912ba524aff3";
sha256 = "sha256-5QJrWIu4EgnHcOqMwlrs2JBBx7aI9OaSJswesr6Apfk=";
};
packageRequires = [ epkgs.inheritenv ];
})
];
};
}
#+END_SRC
#+BEGIN_SRC elisp
(use-package claude-code
:bind-keymap ("C-c c" . claude-code-command-map)
:custom (claude-code-optimize-window-resize nil))
#+END_SRC
* Theme
:PROPERTIES:
:header-args:nix: :noweb-ref nix-configs