diff --git a/home.org b/home.org index c1e37c0..aa37b81 100644 --- a/home.org +++ b/home.org @@ -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 () + <> + ) + + (defun my/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