use-package / more prose
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user