3 Commits

Author SHA1 Message Date
Joe Frikker 3682c1ad10 flake update 2026-08-19 21:32:09 -04:00
Joe Frikker 5f639e747d kitty? 2026-08-19 17:39:50 -04:00
Joe Frikker 3159d20e6d wip 2026-08-06 16:22:57 -04:00
2 changed files with 277 additions and 173 deletions
Generated
+17 -35
View File
@@ -2,40 +2,22 @@
"nodes": { "nodes": {
"claude-code": { "claude-code": {
"inputs": { "inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
] ],
},
"locked": {
"lastModified": 1783380155,
"narHash": "sha256-SwUwKaLrZ+c5y4GoZHKBf1nUsDHVsIUtn2CFloZrV2A=",
"owner": "sadjow",
"repo": "claude-code-nix",
"rev": "25d979d1a39d0acdbcb1b8d0b9d83ffdd10b5f43",
"type": "github"
},
"original": {
"owner": "sadjow",
"repo": "claude-code-nix",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1731533236, "lastModified": 1787169825,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "narHash": "sha256-3MmWHAzeoFHfwjUCQC01olBN+MC4xoSuR7D0bpPr+EE=",
"owner": "numtide", "owner": "sadjow",
"repo": "flake-utils", "repo": "claude-code-nix",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "rev": "f575914388682670df73e80c9caf82063b659699",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "numtide", "owner": "sadjow",
"repo": "flake-utils", "repo": "claude-code-nix",
"type": "github" "type": "github"
} }
}, },
@@ -46,11 +28,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1783436070, "lastModified": 1787176219,
"narHash": "sha256-F80z1JoiJgZyTT5D+3siLOVzqmCEphLR7t0Ym/I2CLI=", "narHash": "sha256-djoRr6jBpe35q/0JwAvXpFXg1Ktf+X54NU2RLR7wnHw=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "f09af49406ffad37acb6538d3207189a1a1e0b7e", "rev": "c53d643b3737e2fcd04e6cb3b3580ef50b2087a0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -67,11 +49,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1783414108, "lastModified": 1786852476,
"narHash": "sha256-RY8e+gR2/DhXsYDxGDL6Hhe9+POD9u4+llwxMBqMQDs=", "narHash": "sha256-IM5CYtf86W4w8eUPpKcY/LpdHElmVBtJhaKnoTKxZEA=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-index-database", "repo": "nix-index-database",
"rev": "96d6de10eb281b98f5cfcd1841394c03da5df77c", "rev": "c7962dc97b45129df8d751bedaf37beb5a17706e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -82,11 +64,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1783148766, "lastModified": 1787101114,
"narHash": "sha256-uslt2pqShTIXDdAHRHv2QkYLsVdY8Oqwz0EA48/RSM8=", "narHash": "sha256-gwrPcFf/rDjHPaVflbDZ040ZDmBTRj/7+s8ZmE2SaIM=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a50de1b7d8a586adc18d2395c19de7d6058e6030", "rev": "b18a4b905f8d028dc4476412e6d6891728695379",
"type": "github" "type": "github"
}, },
"original": { "original": {
+260 -138
View File
@@ -318,6 +318,7 @@ We all know what ~git~ does.
settings.user.name = "Joe Frikker"; settings.user.name = "Joe Frikker";
settings.user.email = "joe@redbookcattle.com"; settings.user.email = "joe@redbookcattle.com";
settings.github.user = "joe@redbookcattle.com"; settings.github.user = "joe@redbookcattle.com";
settings.merge.conflictstyle = "zdiff3";
}; };
programs.delta = { programs.delta = {
@@ -344,7 +345,7 @@ The best text editor ever? Heresy!
auto-save.after-delay.timeout = 1000; auto-save.after-delay.timeout = 1000;
cursorline = true; cursorline = true;
idle-timeout = 0; idle-timeout = 0;
rulers = [100]; rulers = [120];
text-width = 100; text-width = 100;
lsp.goto-reference-include-declaration = false; lsp.goto-reference-include-declaration = false;
cursor-shape.insert = "bar"; cursor-shape.insert = "bar";
@@ -505,6 +506,7 @@ Then the real lua config:
#+BEGIN_SRC lua #+BEGIN_SRC lua
local config = {} local config = {}
config.default_prog = { '/Users/jfrikker/.nix-profile/bin/zsh', '-l' } config.default_prog = { '/Users/jfrikker/.nix-profile/bin/zsh', '-l' }
config.font = wezterm.font 'Iosevka Term SS14'
config.font_size = 13.0 config.font_size = 13.0
-- config.font = wezterm.font("JetBrains Mono") -- config.font = wezterm.font("JetBrains Mono")
config.inactive_pane_hsb = { config.inactive_pane_hsb = {
@@ -692,6 +694,32 @@ Now we'll set up some keybindings:
end end
#+END_SRC #+END_SRC
** Kitty
#+BEGIN_SRC nix :tangle target/desktop/kitty.nix
{pkgs, ...}: {
programs.kitty = {
enable = true;
font = {
name = "Iosevka Term SS14";
package = pkgs.iosevka-bin.override { variant = "SGr-IosevkaTermSS14"; };
size = 13;
};
themeFile = "Catppuccin-Frappe";
keybindings = {
"ctrl+1" = "goto_tab 1";
"ctrl+2" = "goto_tab 2";
"ctrl+3" = "goto_tab 3";
"ctrl+4" = "goto_tab 4";
"ctrl+5" = "goto_tab 5";
"ctrl+6" = "goto_tab 6";
"ctrl+7" = "goto_tab 7";
"ctrl+8" = "goto_tab 8";
"ctrl+9" = "goto_tab 9";
};
};
}
#+END_SRC
** Ghostty ** Ghostty
#+BEGIN_SRC nix :tangle target/desktop/ghostty.nix #+BEGIN_SRC nix :tangle target/desktop/ghostty.nix
@@ -699,6 +727,11 @@ Now we'll set up some keybindings:
programs.ghostty = { programs.ghostty = {
enable = true; enable = true;
package = pkgs.ghostty-bin; package = pkgs.ghostty-bin;
settings = {
adjust-cell-height = "15%";
font-family = "Iosevka Term SS14";
font-size = 13;
};
}; };
} }
#+END_SRC #+END_SRC
@@ -832,6 +865,8 @@ Turn off some default settings that I don't find useful.
(column-number-mode t) (column-number-mode t)
(setopt auto-save-default nil) (setopt auto-save-default nil)
(setopt create-lockfiles nil) (setopt create-lockfiles nil)
(setopt enable-recursive-minibuffers t)
(setopt line-spacing 0.15)
(setopt mouse-wheel-tilt-scroll t) (setopt mouse-wheel-tilt-scroll t)
(setq-default truncate-lines t) (setq-default truncate-lines t)
@@ -987,7 +1022,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
@@ -1019,152 +1054,229 @@ windows. I place windows in the bottom or on the right mostly depending on how w
content to be. content to be.
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(defun jf/window-children (window) (defun jf/window-children (window)
(let ((result nil) (let ((result nil)
(child (window-child window))) (child (window-child window)))
(while child (while child
(push child result) (push child result)
(setq child (window-next-sibling child))) (setq child (window-next-sibling child)))
(reverse result))) (reverse result)))
(defun jf/enforce-right-side-heights (win) (defun jf/enforce-right-side-heights (win)
(let ((slot-heights '((-1 . 20))) (let ((slot-heights '((-1 . 20)))
(parent (window-parent win))) (parent (window-parent win)))
(when parent (when parent
(let ((children (jf/window-children parent))) (let ((children (jf/window-children parent)))
(when (> (length children) 1) (when (> (length children) 1)
(cl-loop for child in children (cl-loop for child in children
for slot = (window-parameter child 'window-slot) for slot = (window-parameter child 'window-slot)
for height = (alist-get slot slot-heights) for height = (alist-get slot slot-heights)
when height do (progn (window-resize child (- height (window-height child))) when height do (progn (window-resize child (- height (window-height child)))
(window-preserve-size child nil t)))))))) (window-preserve-size child nil t))))))))
(defun jf/enforce-right-side-width (win) (defun jf/enforce-right-side-width (win)
"Resize side window WIN so its frame keeps 120 columns for the rest of the frame." "Resize side window WIN so its frame keeps 120 columns for the rest of the frame."
(let ((width (max 1 (- (frame-width (window-frame win)) 120)))) (let ((width (max 1 (- (frame-width (window-frame win)) 120))))
(window-resize win (- width (window-width win)) t))) (window-resize win (- width (window-width win)) t)))
(defun jf/enforce-right-side-widths (frame) (defun jf/enforce-right-side-widths (frame)
"Re-apply `jf/enforce-right-side-width' to all of FRAME's right-side windows." "Re-apply `jf/enforce-right-side-width' to all of FRAME's right-side windows."
(dolist (win (window-list frame 'nomini)) (dolist (win (window-list frame 'nomini))
(when (eq (window-parameter win 'window-side) 'right) (when (eq (window-parameter win 'window-side) 'right)
(jf/enforce-right-side-width win)))) (jf/enforce-right-side-width win))))
(add-hook 'window-size-change-functions #'jf/enforce-right-side-widths) (add-hook 'window-size-change-functions #'jf/enforce-right-side-widths)
;; (require 'perspective) ;; (require 'perspective)
;; (setopt persp-mode-prefix-key (kbd "C-x t")) ;; (setopt persp-mode-prefix-key (kbd "C-x t"))
;; (setopt persp-show-modestring nil) ;; (setopt persp-show-modestring nil)
;; (persp-mode) ;; (persp-mode)
;; (defun jf/popper-group-by-owning-perspective () ;; (defun jf/popper-group-by-owning-perspective ()
;; "Return the name of the perspective that owns the current buffer. ;; "Return the name of the perspective that owns the current buffer.
;; Unlike `popper-group-by-perspective', which just returns whichever ;; Unlike `popper-group-by-perspective', which just returns whichever
;; perspective happens to be active on the frame right now, this looks ;; perspective happens to be active on the frame right now, this looks
;; up which perspective's buffer list the popup buffer actually belongs ;; up which perspective's buffer list the popup buffer actually belongs
;; to. This matters because popper re-groups popups on ;; to. This matters because popper re-groups popups on
;; `window-configuration-change-hook', which perspective.el triggers ;; `window-configuration-change-hook', which perspective.el triggers
;; *after* switching the frame's active perspective -- so ;; *after* switching the frame's active perspective -- so
;; `popper-group-by-perspective' ends up filing a popup under the ;; `popper-group-by-perspective' ends up filing a popup under the
;; perspective you just switched *to* rather than the one it came from." ;; perspective you just switched *to* rather than the one it came from."
;; (let ((buf (current-buffer))) ;; (let ((buf (current-buffer)))
;; (or (cl-loop for persp being the hash-values of (perspectives-hash (selected-frame)) ;; (or (cl-loop for persp being the hash-values of (perspectives-hash (selected-frame))
;; if (memq buf (persp-buffers persp)) ;; if (memq buf (persp-buffers persp))
;; return (persp-name persp)) ;; return (persp-name persp))
;; (persp-current-name)))) ;; (persp-current-name))))
(setopt popper-reference-buffers (setopt popper-reference-buffers
'("\\*Flymake diagnostics .*" '("\\*Flymake diagnostics .*"
"\\*Embark Export: .*" "\\*Embark Export: .*"
"\\*Embark Collect .*" "\\*Embark Collect .*"
"\\*xref\\*" "\\*xref\\*"
"\\*compilation\\*" "\\*compilation\\*"
"\\*pnpm:.*" "\\*pnpm:.*"
"\\*sly-mrepl *" "\\*sly-mrepl *"
"\\*Messages\\*" "\\*lispy-message\\*"
"\\*lispy-message\\*" "\\*occur\\*"
"\\*EGLOT connections\\*" ".*eshell\\*"
"\\*trace-output\\*" "\\*SQL: .*"
"\\*occur\\*" "magit-revision: .*"
".*eshell\\*" "\\*Help\\*"
"\\*SQL: .*" "\\*rustfmt\\*"
"magit: *" "\\*slack: .*"
"magit-revision: .*" "\\*forge: .*"
"magit-log*" "new-pullreq"
"\\*Help\\*" "\\*claude:.*"
"\\*rustfmt\\*" "\\*Man .*"
"\\*slack: .*" "\\*List .*"
"\\*forge: .*" "\\*eldoc\\*"))
"new-pullreq" (setopt popper-display-control nil)
"\\*claude:.*" ;; (setopt popper-group-function 'jf/popper-group-by-owning-perspective)
"\\*Man .*"
"\\*List .*"
"\\*eldoc\\*"))
(setopt popper-display-control nil)
;; (setopt popper-group-function 'jf/popper-group-by-owning-perspective)
(popper-mode) (popper-mode)
(popper-echo-mode) (popper-echo-mode)
(bind-keys ("C-q" . popper-toggle) (bind-keys ("C-q" . popper-toggle)
("C-;" . popper-cycle)) ("C-;" . popper-cycle))
(setq display-buffer-alist (defvar jf/fullscreen-popup--param 'jf/fullscreen-saved-configuration
'(((or "\\*Flymake diagnostics .*" "Key used to stash the window configuration a fullscreen popup replaced.
"\\*Embark Export: .*" Stored per-tab when `tab-bar-mode' is active, otherwise as a plain frame
"\\*Embark Collect .*" parameter; see `jf/tab-or-frame-parameter'.")
"\\*xref\\*"
"\\*compilation\\*"
"\\*pnpm:.*"
"\\*sly-mrepl *"
"\\*Messages\\*"
"\\*lispy-message\\*"
"\\*EGLOT connections\\*"
"\\*trace-output\\*"
"\\*occur\\*"
".*eshell\\*"
"\\*SQL: .*")
(display-buffer-in-side-window)
(side . bottom)
(slot . 0)
(window-height . 0.33)
(window-parameters (no-delete-other-windows . t)
(no-other-window . t)))
((or "magit: *"
"magit-revision: .*"
"magit-log*"
"\\*Help\\*"
"\\*rustfmt\\*"
"\\*slack: .*"
"\\*forge: .*"
"new-pullreq"
"\\*claude:.*"
"\\*Man .*"
"\\*List .*")
(display-buffer-in-side-window)
(side . right)
(slot . 0)
(window-width . jf/enforce-right-side-width)
(window-height . jf/enforce-right-side-heights)
(preserve-size . (nil . nil))
(window-parameters (no-delete-other-windows . t)
(no-other-window . t)))
((or "\\*Embark Actions\\*"
"\\*eldoc\\*")
(display-buffer-in-side-window)
(side . right)
(slot . -1)
(window-width . jf/enforce-right-side-width)
(window-height . jf/enforce-right-side-heights)
(preserve-size . (nil . t))
(window-parameters (no-delete-other-windows . t)
(no-other-window . t)))))
(setopt window-persistent-parameters (defvar-local jf/fullscreen-popup-p nil
(cl-list* '(no-delete-other-windows . writable) "Non-nil in a buffer currently being displayed as a fullscreen popup.")
'(no-other-window . writable)
window-persistent-parameters)) (defun jf/current-tab-cell (&optional frame)
"Return FRAME's current tab's raw data cell, or nil without `tab-bar-mode'."
(and (bound-and-true-p tab-bar-mode)
(assq 'current-tab (tab-bar-tabs frame))))
(defun jf/tab-or-frame-parameter (parameter &optional frame)
"Like `frame-parameter', but scoped to FRAME's selected tab when tabs are in use.
A plain frame parameter is shared by every tab on that frame, which is wrong
for state like `jf/fullscreen-popup--param': switching tabs swaps in an
entirely different window layout, so \"the layout to restore\" has to travel
with the tab, not the frame."
(if-let ((tab (jf/current-tab-cell frame)))
(alist-get parameter tab)
(frame-parameter frame parameter)))
(defun jf/set-tab-or-frame-parameter (parameter value &optional frame)
"Set PARAMETER to VALUE, scoped like `jf/tab-or-frame-parameter'."
(if-let ((tab (jf/current-tab-cell frame)))
(let ((cell (assq parameter tab)))
(if cell
(setcdr cell value)
(setcdr tab (cons (cons parameter value) (cdr tab)))))
(set-frame-parameter frame parameter value)))
(defun jf/display-buffer-fullscreen (buffer alist)
"Display BUFFER, deleting other windows, saving the prior layout.
Intended for use in `display-buffer-alist' for popups (e.g. Magit
status/log) that should take over the frame while displayed, but
restore the previous window configuration once closed via either
`q' or `popper-toggle' -- both end up calling `quit-window', which
is where the restore actually happens; see
`jf/quit-window-restore-fullscreen'."
(unless (jf/tab-or-frame-parameter jf/fullscreen-popup--param)
(jf/set-tab-or-frame-parameter jf/fullscreen-popup--param
(current-window-configuration)))
(when-let ((window (or (display-buffer-reuse-window buffer alist)
(display-buffer-same-window buffer alist)
(display-buffer-pop-up-window buffer alist)
(display-buffer-use-some-window buffer alist))))
(let ((ignore-window-parameters t))
(delete-other-windows window))
(with-current-buffer buffer
(setq jf/fullscreen-popup-p t))
window))
(defun jf/quit-window-restore-fullscreen (orig-fn &optional kill window)
"Restore the saved window configuration after quitting a fullscreen popup.
Advice around `quit-window' so both `q' (which Magit and other
special-mode buffers bind to buffer-quitting commands that call
`quit-window') and Popper's close/toggle commands (which also call
`quit-window' directly) trigger the restore. Only restores once the
last fullscreen popup on the tab (or frame, without `tab-bar-mode')
has closed, so opening one fullscreen popup from within another
falls back to the outer one first."
(let* ((window (or window (selected-window)))
(was-fullscreen (buffer-local-value 'jf/fullscreen-popup-p
(window-buffer window)))
(frame (window-frame window)))
(funcall orig-fn kill window)
(when (and was-fullscreen
(not (and (window-live-p window)
(buffer-local-value 'jf/fullscreen-popup-p
(window-buffer window))))
(jf/tab-or-frame-parameter jf/fullscreen-popup--param frame))
(let ((conf (jf/tab-or-frame-parameter jf/fullscreen-popup--param frame)))
(jf/set-tab-or-frame-parameter jf/fullscreen-popup--param nil frame)
(set-window-configuration conf)))))
(advice-add 'quit-window :around #'jf/quit-window-restore-fullscreen)
(setq display-buffer-alist
'(((or "magit: *"
"magit-log*"
"\\*Messages\\*"
"\\*trace-output\\*"
"\\*EGLOT connections\\*")
(jf/display-buffer-fullscreen))
((or "\\*Flymake diagnostics .*"
"\\*Embark Export: .*"
"\\*Embark Collect .*"
"\\*xref\\*"
"\\*compilation\\*"
"\\*pnpm:.*"
"\\*sly-mrepl *"
"\\*lispy-message\\*"
"\\*occur\\*"
".*eshell\\*"
"\\*SQL: .*")
(display-buffer-in-side-window)
(side . bottom)
(slot . 0)
(window-height . 0.33)
(window-parameters (no-delete-other-windows . t)
(no-other-window . t)))
((or "magit-revision: .*"
"\\*Help\\*"
"\\*rustfmt\\*"
"\\*slack: .*"
"\\*forge: .*"
"new-pullreq"
"\\*claude:.*"
"\\*Man .*"
"\\*List .*")
(display-buffer-in-side-window)
(side . right)
(slot . 0)
(window-width . jf/enforce-right-side-width)
(window-height . jf/enforce-right-side-heights)
(preserve-size . (nil . nil))
(window-parameters (no-delete-other-windows . t)
(no-other-window . t)))
((or "\\*Embark Actions\\*"
"\\*eldoc\\*")
(display-buffer-in-side-window)
(side . right)
(slot . -1)
(window-width . jf/enforce-right-side-width)
(window-height . jf/enforce-right-side-heights)
(preserve-size . (nil . t))
(window-parameters (no-delete-other-windows . t)
(no-other-window . t)))))
(setopt window-persistent-parameters
(cl-list* '(no-delete-other-windows . writable)
'(no-other-window . writable)
window-persistent-parameters))
#+END_SRC #+END_SRC
@@ -1497,6 +1609,7 @@ I don't like UI elements that insert fake text into the file. They mess up the s
(setopt eglot-ignored-server-capabilities '(:inlayHintProvider :semanticTokensProvider)) (setopt eglot-ignored-server-capabilities '(:inlayHintProvider :semanticTokensProvider))
(add-hook 'eglot-managed-mode-hook (lambda () (eglot-inlay-hints-mode -1)) nil t) (add-hook 'eglot-managed-mode-hook (lambda () (eglot-inlay-hints-mode -1)) nil t)
(setopt eglot-code-action-indications nil) (setopt eglot-code-action-indications nil)
(setopt eglot-events-buffer-config '(:size 300000 :format full))
#+END_SRC #+END_SRC
Set up a few useful eglot keys. Set up a few useful eglot keys.
@@ -1885,6 +1998,8 @@ for completion. That makes it really annoying to use; don't use yasnippet with e
("C-c C" . org-capture) ("C-c C" . org-capture)
("C-c l" . org-id-store-link)) ("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) (add-hook 'org-mode-hook 'visual-line-mode)
(setopt org-link-keep-stored-after-insertion t (setopt org-link-keep-stored-after-insertion t
org-capture-templates org-capture-templates
@@ -2208,6 +2323,13 @@ I like Catppuccin Frappe as my theme. Let's use it in as many places as we can.
return config return config
#+END_SRC #+END_SRC
** Ghostty
#+BEGIN_SRC nix :tangle target/desktop/ghostty-theme.nix
{
programs.ghostty.settings.theme = "Catppuccin Frappe";
}
#+END_SRC
** Emacs ** Emacs
:PROPERTIES: :PROPERTIES:
:header-args:elisp: :tangle target/desktop/emacs-theme.el :header-args:elisp: :tangle target/desktop/emacs-theme.el
@@ -2232,7 +2354,7 @@ I like Catppuccin Frappe as my theme. Let's use it in as many places as we can.
;; (set-face-attribute 'default nil :font "JetBrainsMono Nerd Font" :height 130) ;; (set-face-attribute 'default nil :font "JetBrainsMono Nerd Font" :height 130)
;; (set-face-attribute 'fixed-pitch nil :font "JetBrainsMono Nerd Font" :height 130) ;; (set-face-attribute 'fixed-pitch nil :font "JetBrainsMono Nerd Font" :height 130)
(set-face-attribute 'default nil :font "Iosevka Term SS14" :height 130 :width 'expanded) (set-face-attribute 'default nil :font "Iosevka Term SS14" :height 130)
(set-face-attribute 'fixed-pitch nil :font "Iosevka Term SS14" :height 130 :width 'expanded) (set-face-attribute 'fixed-pitch nil :font "Iosevka Term SS14" :height 130)
(set-face-attribute 'variable-pitch nil :font "Iosevka Etoile" :height 130) (set-face-attribute 'variable-pitch nil :font "Iosevka Etoile" :height 130)
#+END_SRC #+END_SRC