Compare commits

..

No commits in common. "937ab7e51078d7918d12418e82a93cba4b04ced1" and "380fa002c22cd99c9af324acdc735d742fd5f335" have entirely different histories.

20 changed files with 27 additions and 540 deletions

View file

@ -1,9 +0,0 @@
#!/bin/bash
# Extract Message-ID from email and copy as neomutt:// link to clipboard
# Used by neomutt macro - reads email from stdin
message_id=$(grep -i '^Message-ID:' | head -1 | sed 's/Message-ID: *<//i; s/>//' | tr -d '\n\r')
if [[ -n $message_id ]]; then
printf 'neomutt://%s' "$message_id" | ~/dotfiles/bin/cb
fi

View file

@ -1,11 +0,0 @@
#!/bin/bash
# Open a specific message in neomutt by message ID
# Usage: neomutt-open-message <message-id>
message_id="$1"
if [[ -z $message_id ]]; then
echo "Usage: neomutt-open-message <message-id>" >&2
exit 1
fi
exec neomutt -e "push \"<vfolder-from-query>id:${message_id}<enter><display-message>\""

View file

@ -1,48 +0,0 @@
#!/bin/bash
# Inverse search callback for sioyek/vimtex/skim
# Usage: nvim-vimtex-callback LINE FILE
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SERVERNAME_FILE="/tmp/vimtex-servername"
# Read servername if available and server still exists
SERVERNAME_ARG=""
if [[ -f $SERVERNAME_FILE ]]; then
SERVERNAME=$(cat "$SERVERNAME_FILE")
if [[ -n $SERVERNAME && -e $SERVERNAME ]]; then
SERVERNAME_ARG="--servername $SERVERNAME"
fi
fi
# If first arg is a number, assume sioyek direct format: LINE FILE
if [[ $1 =~ ^[0-9]+$ ]]; then
LINE="$1"
FILE="$2"
exec "$SCRIPT_DIR/path-shim" nvr $SERVERNAME_ARG --remote-silent +"$LINE" "$FILE"
fi
# Otherwise parse VimTeX format: --headless -c "VimtexInverseSearch LINE 'FILE'"
CMD=""
while [[ $# -gt 0 ]]; do
case $1 in
--headless)
shift
;;
-c)
shift
CMD="$1"
shift
;;
*)
shift
;;
esac
done
if [[ -n $CMD ]]; then
if [[ $CMD =~ VimtexInverseSearch\ ([0-9]+)\ \'(.+)\' ]]; then
LINE="${BASH_REMATCH[1]}"
FILE="${BASH_REMATCH[2]}"
exec "$SCRIPT_DIR/path-shim" nvr $SERVERNAME_ARG --remote-silent +"$LINE" "$FILE"
fi
fi

View file

@ -1,44 +0,0 @@
#!/bin/bash
# Open a neomutt:// link in neomutt via notmuch
# Usage: open-message-link [--current] neomutt://message-id
# --current: Open in current terminal (for nvim integration)
# Without flag: Opens in Ghostty on workspace 8 (like open-mail)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
set -euo pipefail
open_in_current=false
if [[ ${1:-} == "--current" ]]; then
open_in_current=true
shift
fi
url="${1:-}"
if [[ -z $url ]]; then
echo "Usage: open-message-link [--current] neomutt://message-id" >&2
exit 1
fi
# Extract message ID from URL
message_id="${url#neomutt://}"
notmuch_url="notmuch://?query=id:${message_id}"
if $open_in_current; then
exec neomutt -f "$notmuch_url"
else
if [[ "$(uname)" == "Darwin" ]]; then
aerospace workspace 8
open -na Ghostty --args -e "$SCRIPT_DIR/path-shim" "$SCRIPT_DIR/neomutt-open-message" "$message_id"
else
# Linux (i3/sway)
if command -v swaymsg &>/dev/null; then
swaymsg workspace 8
ghostty -e neomutt -e "push \"<vfolder-from-query>id:${message_id}<enter><display-message>\"" &
elif command -v i3-msg &>/dev/null; then
i3-msg workspace 8
ghostty -e neomutt -e "push \"<vfolder-from-query>id:${message_id}<enter><display-message>\"" &
else
exec neomutt -f "$notmuch_url"
fi
fi
fi

View file

@ -28,23 +28,10 @@
;; (setq default-frame-alist '((ns-appearance . dark) ;; (setq default-frame-alist '((ns-appearance . dark)
;; (ns-transparent-titlebar . t))) ;; (ns-transparent-titlebar . t)))
;; Use dynamic GCC paths to avoid recompilation when Homebrew updates GCC
(when-let* ((gcc-base "/opt/homebrew/opt/gcc/lib/gcc/current")
((file-directory-p gcc-base)))
(setenv "LIBRARY_PATH" (setenv "LIBRARY_PATH"
(string-join (mapconcat 'identity
(delq nil '(
(list gcc-base "/opt/homebrew/opt/gcc/lib/gcc/15"
(let ((jit-path "/opt/homebrew/opt/libgccjit/lib/gcc/current")) "/opt/homebrew/opt/libgccjit/lib/gcc/15"
(when (file-directory-p jit-path) jit-path)) "/opt/homebrew/opt/gcc/lib/gcc/15/gcc/aarch64-apple-darwin24/15")
;; Find the arch-specific directory (e.g., aarch64-apple-darwin24/15) ":"))
(car (last (file-expand-wildcards
(concat gcc-base "/gcc/aarch64-apple-darwin*/*"))))))
":")))
;; Native compilation settings to reduce unnecessary recompilation
(when (native-comp-available-p)
(setq native-comp-async-report-warnings-errors 'silent)
(setq native-compile-prune-cache t)
;; Redirect eln-cache to writable location (default goes to read-only ~/.emacs.d/)
(startup-redirect-eln-cache (expand-file-name "eln-cache/" minimal-emacs-var-dir)))

View file

@ -81,9 +81,6 @@ bind compose S pgp-menu
macro compose a "<shell-escape>~/dotfiles/bin/yazi-pick-file<enter><enter-command>source /tmp/neomutt-yazi-pick<enter><shell-escape>~/dotfiles/bin/yazi-pick-file clean<enter>" "Attach file with yazi" macro compose a "<shell-escape>~/dotfiles/bin/yazi-pick-file<enter><enter-command>source /tmp/neomutt-yazi-pick<enter><shell-escape>~/dotfiles/bin/yazi-pick-file clean<enter>" "Attach file with yazi"
bind compose d detach-file bind compose d detach-file
# Copy message link to clipboard (message://message-id format)
macro index,pager Y "<pipe-message>~/dotfiles/bin/copy-message-link<enter>" "Copy message link"
# Mark messages # Mark messages
bind index,pager m noop bind index,pager m noop
macro index,pager mu "<enter-command>unset mark_old<enter><tag-prefix><toggle-new><sync-mailbox>" "Mark as unread" macro index,pager mu "<enter-command>unset mark_old<enter><tag-prefix><toggle-new><sync-mailbox>" "Mark as unread"

View file

@ -61,63 +61,10 @@ add { source = 'R-nvim/R.nvim', depends = { 'nvim-treesitter/nvim-treesitter' }
add 'nvim-treesitter/nvim-treesitter' add 'nvim-treesitter/nvim-treesitter'
add 'nvim-treesitter/nvim-treesitter-textobjects' add 'nvim-treesitter/nvim-treesitter-textobjects'
add { source = 'nvim-pack/nvim-spectre', depends = { 'nvim-lua/plenary.nvim' } } add { source = 'nvim-pack/nvim-spectre', depends = { 'nvim-lua/plenary.nvim' } }
add 'lervag/vimtex'
-- color themes -- color themes
add 'EdenEast/nightfox.nvim' add 'EdenEast/nightfox.nvim'
now(function() require('vimtex').setup() end)
-- Message link handler for neomutt/notmuch integration
now(function()
local function open_neomutt_link(url)
local message_id = url:gsub('^neomutt://', '')
-- vim.notify('Opening: ' .. message_id, vim.log.levels.INFO)
-- Use vfolder-from-query then display the message (hide sidebar and index, q quits directly)
-- Note: nvim terminal doesn't support neomutt's directcolor, so we disable colors for clean display
local search_cmd = string.format(
[[neomutt -e "set color_directcolor=no sidebar_visible=no pager_index_lines=0" -e "color normal default default" -e "color hdrdefault default default" -e "color quoted default default" -e "color signature default default" -e "color attachment default default" -e "color header default default '.*'" -e "color body default default '.*'" -e "macro pager q '<exit><quit>'" -e "macro index q '<quit>'" -e "push \"<vfolder-from-query>id:%s<enter><display-message>\""]],
message_id
)
require('snacks').terminal(search_cmd, {
win = { position = 'bottom', height = 0.4 },
})
-- local script = vim.env.HOME .. '/dotfiles/bin/open-message-link'
-- vim.fn.jobstart({ script, url }, { detach = true })
end
vim.api.nvim_create_user_command(
'OpenMessageLink',
function(opts) open_neomutt_link(opts.args) end,
{ nargs = 1, desc = 'Open email message link in neomutt' }
)
-- gx override: opens neomutt:// links, falls back to default for others
-- Use BufEnter to override markview's buffer-local gx mapping
vim.api.nvim_create_autocmd('BufEnter', {
pattern = '*.md',
callback = function()
vim.keymap.set('n', 'gx', function()
local line = vim.api.nvim_get_current_line()
local url = line:match 'neomutt://[^%)%s>]+'
if url then
open_neomutt_link(url)
else
-- Use markview's link opener or fallback
local ok, markview = pcall(require, 'markview')
if ok and markview.actions and markview.actions.openLink then
markview.actions.openLink()
else
vim.ui.open(vim.fn.expand '<cfile>')
end
end
end, { buffer = true, desc = 'Open link (supports neomutt://)' })
end,
})
end)
now(function() now(function()
require('mail-count').setup { require('mail-count').setup {
accounts = { accounts = {
@ -364,8 +311,6 @@ later(function()
'diff', 'diff',
'git_rebase', 'git_rebase',
'gitcommit', 'gitcommit',
'latex',
'bibtex',
}, },
auto_install = true, auto_install = true,
highlight = { enable = true }, highlight = { enable = true },

View file

@ -1,79 +0,0 @@
-- VimTeX configuration
local M = {}
function M.setup()
-- Sioyek - cross-platform PDF viewer with vim-like keybindings
vim.g.vimtex_view_method = 'general'
vim.g.vimtex_view_general_viewer = 'sioyek'
vim.g.vimtex_view_general_options = '--forward-search-file @tex --forward-search-line @line @pdf'
-- Skim (macOS)
-- vim.g.vimtex_view_method = 'skim'
-- Compiler settings
vim.g.vimtex_compiler_method = 'latexmk'
vim.g.vimtex_compiler_latexmk = {
build_dir = 'build',
callback = 1,
continuous = 1,
executable = 'latexmk',
options = {
'-verbose',
'-file-line-error',
'-synctex=1',
'-interaction=nonstopmode',
},
}
-- Quickfix settings
vim.g.vimtex_quickfix_mode = 0 -- Don't open quickfix automatically
-- Disable default mappings, we'll set our own
vim.g.vimtex_mappings_enabled = 1
-- TOC settings
vim.g.vimtex_toc_config = {
split_pos = 'vert leftabove',
split_width = 40,
show_help = 0,
}
-- Fold settings
vim.g.vimtex_fold_enabled = 0
-- Set up filetype-specific keymaps
vim.api.nvim_create_autocmd('FileType', {
pattern = { 'tex', 'latex' },
callback = function()
local opts = { buffer = true, silent = true }
-- Compilation - saves servername for inverse search
vim.keymap.set('n', '<localleader>ll', function()
local f = io.open('/tmp/vimtex-servername', 'w')
if f then
f:write(vim.v.servername)
f:close()
end
vim.cmd 'VimtexCompile'
end, vim.tbl_extend('force', opts, { desc = 'Compile LaTeX' }))
vim.keymap.set('n', '<localleader>lk', '<cmd>VimtexStop<cr>', vim.tbl_extend('force', opts, { desc = 'Stop compilation' }))
vim.keymap.set('n', '<localleader>lc', '<cmd>VimtexClean<cr>', vim.tbl_extend('force', opts, { desc = 'Clean aux files' }))
vim.keymap.set('n', '<localleader>lC', '<cmd>VimtexClean!<cr>', vim.tbl_extend('force', opts, { desc = 'Clean all files' }))
-- View PDF (forward search)
vim.keymap.set('n', '<localleader>lv', '<cmd>VimtexView<cr>', vim.tbl_extend('force', opts, { desc = 'View PDF (forward search)' }))
-- TOC
vim.keymap.set('n', '<localleader>lt', '<cmd>VimtexTocToggle<cr>', vim.tbl_extend('force', opts, { desc = 'Toggle TOC' }))
-- Errors
vim.keymap.set('n', '<localleader>le', '<cmd>VimtexErrors<cr>', vim.tbl_extend('force', opts, { desc = 'Show errors' }))
-- Info
vim.keymap.set('n', '<localleader>li', '<cmd>VimtexInfo<cr>', vim.tbl_extend('force', opts, { desc = 'VimTeX info' }))
vim.keymap.set('n', '<localleader>ls', '<cmd>VimtexStatus<cr>', vim.tbl_extend('force', opts, { desc = 'Compilation status' }))
end,
})
end
return M

View file

@ -1,3 +0,0 @@
*.db
auto.config
*.txt

View file

@ -1,94 +0,0 @@
# Sioyek user keybindings
# Vim-like keybindings
# Navigation - use visual mark commands (works as scroll when no mark exists)
move_visual_mark_down j
move_visual_mark_up k
move_left h
move_right l
# Page navigation
next_page J
previous_page K
screen_down <C-d>
screen_up <C-u>
screen_down <C-f>
screen_up <C-b>
goto_page_with_page_number <C-g>
goto_beginning gg
goto_end G
# Chapter navigation (like vim [[ ]])
next_chapter ]]
prev_chapter [[
# History navigation (like vim jumplist)
prev_state <C-o>
next_state <tab>
# Scroll
screen_down <space>
screen_up <S-space>
# Search
search /
next_item n
prev_item N
# Copy
copy y
# Command mode
command :
# Zoom
zoom_in +
zoom_in =
zoom_out -
fit_to_page_width w
fit_to_page_width_smart e
# Bookmarks
add_bookmark m
goto_bookmark '
delete_bookmark dm
# Highlights - mouse select text, then h + letter for color
add_highlight H
goto_next_highlight ]h
goto_prev_highlight [h
delete_highlight dh
# Table of contents
goto_toc t
# Visual mark - right-click or v to create, then j/k to move
visual_mark_under_cursor v
toggle_visual_scroll <F7>
# Synctex (for LaTeX integration)
# F4 toggles synctex mode, then right-click on text jumps to source
# Use v to start visual mark, then Enter to jump to source in editor
toggle_synctex <F4>
synctex_under_ruler <return>
# Color mode toggle
toggle_dark_mode <C-i>
toggle_custom_color <C-r>
# Open/close
quit q
quit ZZ
quit ZQ
open_document o
# View
rotate_clockwise r
rotate_counterclockwise R
toggle_fullscreen F
# Portal (linked view)
portal p
# Overview (thumbnail view)
overview <S-tab>

View file

@ -1,55 +0,0 @@
# Sioyek user preferences
# Noctis Azureus Ghostty theme
# Precise hex to RGB (0.0-1.0) conversions:
# #051b29 -> 5/255=0.0196, 27/255=0.1059, 41/255=0.1608
# #041520 -> 4/255=0.0157, 21/255=0.0824, 32/255=0.1255
# #becfda -> 190/255=0.7451, 207/255=0.8118, 218/255=0.8549
# #49e9a6 -> 73/255=0.2863, 233/255=0.9137, 166/255=0.6510
# #e4b781 -> 228/255=0.8941, 183/255=0.7176, 129/255=0.5059
# #49ace9 -> 73/255=0.2863, 172/255=0.6745, 233/255=0.9137
# Background - deep blue #051b29
background_color 0.0196 0.1059 0.1608
dark_mode_background_color 0.0196 0.1059 0.1608
dark_mode_contrast 1.0
# Custom color mode (toggle with Ctrl+r)
custom_background_color 0.0196 0.1059 0.1608
custom_text_color 0.7451 0.8118 0.8549
# Search highlight (green #49e9a6)
search_highlight_color 0.2863 0.9137 0.6510
# Link color (blue #49ace9)
link_highlight_color 0.2863 0.6745 0.9137
# Text selection/highlight (yellow #e4b781)
text_highlight_color 0.8941 0.7176 0.5059
# Page separator
page_separator_width 2
page_separator_color 0.1569 0.2078 0.2431
# Status bar - darker blue #041520
ui_background_color 0.0157 0.0824 0.1255
ui_text_color 0.7451 0.8118 0.8549
# Startup - use custom color mode and enable synctex by default
should_launch_new_window 0
startup_commands toggle_custom_color;toggle_synctex
# Smooth scrolling
smooth_scroll_speed 3.0
smooth_scroll_drag 2500
# Zoom
default_zoom_level 1.0
zoom_inc_factor 1.2
# Inverse search - click PDF to jump to Neovim source
# %1 = filename, %2 = line number
inverse_search_command /Users/rayandrew/dotfiles/bin/nvim-vimtex-callback %2 %1
# Control+click triggers synctex inverse search
control_click_command synctex_under_cursor

View file

@ -1,49 +0,0 @@
# Noctis Azureus Ghostty theme for Zathura
set default-bg "#051b29"
set default-fg "#becfda"
set statusbar-bg "#041520"
set statusbar-fg "#becfda"
set inputbar-bg "#051b29"
set inputbar-fg "#becfda"
set notification-bg "#051b29"
set notification-fg "#49e9a6"
set notification-error-bg "#051b29"
set notification-error-fg "#e66533"
set notification-warning-bg "#051b29"
set notification-warning-fg "#e4b781"
set highlight-color "#e4b781"
set highlight-active-color "#49e9a6"
set completion-bg "#041520"
set completion-fg "#becfda"
set completion-highlight-bg "#0c3f5f"
set completion-highlight-fg "#becfda"
set index-bg "#051b29"
set index-fg "#becfda"
set index-active-bg "#0c3f5f"
set index-active-fg "#becfda"
set render-loading-bg "#051b29"
set render-loading-fg "#becfda"
# Recolor settings (inverts PDF colors to match theme)
set recolor "true"
# set recolor-reverse-video "true"
set recolor-keephue "true"
set recolor-lightcolor "#051b29"
set recolor-darkcolor "#becfda"
# set recolor-keephue "false"
# Selection settings
set selection-clipboard clipboard
set selection-notification true
# Synctex inverse search (Ctrl+click in PDF jumps to source)
set synctex true
set synctex-editor-command "~/dotfiles/bin/path-shim nvr --remote-silent +%{line} %{input}"

View file

@ -66,7 +66,6 @@
valgrind = mkEnableOption "Enable valgrind"; valgrind = mkEnableOption "Enable valgrind";
hammerspoon = mkEnableOption "Enable hammerspoon"; hammerspoon = mkEnableOption "Enable hammerspoon";
aerospace = mkEnableOption "Enable aerospace"; aerospace = mkEnableOption "Enable aerospace";
skim = mkEnableOption "Enable skim";
}; };
config = lib.mkMerge [ config = lib.mkMerge [
@ -390,10 +389,5 @@
"aerospace" "aerospace"
]; ];
}) })
(lib.mkIf config.custom.brew.skim {
homebrew.casks = [
"skim"
];
})
]; ];
} }

View file

@ -12,8 +12,6 @@
./hammerspoon.nix ./hammerspoon.nix
./kitty.nix ./kitty.nix
./ghostty.nix ./ghostty.nix
./zathura.nix
./sioyek.nix
]; ];
options.custom.gui = with lib; { options.custom.gui = with lib; {

View file

@ -16,7 +16,6 @@
home.packages = with pkgs; [ home.packages = with pkgs; [
(neovim.override { withNodeJs = true; }) (neovim.override { withNodeJs = true; })
tree-sitter tree-sitter
neovim-remote
]; ];
xdg.configFile."nvim".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/nvim"; xdg.configFile."nvim".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/nvim";

View file

@ -1,34 +0,0 @@
{
config,
pkgs,
lib,
dots,
...
}:
{
options.custom.gui = with lib; {
sioyek = {
enable = mkEnableOption "Enable sioyek";
};
};
config = lib.mkIf config.custom.gui.sioyek.enable (
lib.mkMerge [
{
home.packages = with pkgs; [
sioyek
];
}
# Linux uses ~/.config/sioyek
(lib.mkIf pkgs.stdenv.isLinux {
xdg.configFile."sioyek".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/sioyek";
})
# macOS uses ~/Library/Application Support/sioyek
(lib.mkIf pkgs.stdenv.isDarwin {
home.file."Library/Application Support/sioyek".source =
config.lib.file.mkOutOfStoreSymlink "${dots}/config/sioyek";
})
]
);
}

View file

@ -1,22 +0,0 @@
{
config,
pkgs,
lib,
dots,
...
}:
{
options.custom.gui = with lib; {
zathura = {
enable = mkEnableOption "Enable zathura";
};
};
config = lib.mkIf config.custom.gui.zathura.enable {
home.packages = with pkgs; [
zathura
];
xdg.configFile."zathura".source = config.lib.file.mkOutOfStoreSymlink "${dots}/config/zathura";
};
}

View file

@ -67,7 +67,6 @@
valgrind = false; valgrind = false;
hammerspoon = true; hammerspoon = true;
aerospace = true; aerospace = true;
skim = true;
}; };
}; };
@ -100,8 +99,6 @@
ghostty.enable = true; ghostty.enable = true;
hammerspoon.enable = true; hammerspoon.enable = true;
kitty.enable = true; kitty.enable = true;
zathura.enable = true;
sioyek.enable = true;
}; };
email = { email = {
enable = true; enable = true;

View file

@ -0,0 +1,13 @@
diff --git a/early-init.el b/early-init.el
index dfea2f0..d60b6ef 100644
--- a/early-init.el
+++ b/early-init.el
@@ -32,7 +32,7 @@ turned on.")
(defvar minimal-emacs-frame-title-format "%b Emacs"
"Template for displaying the title bar of visible and iconified frame.")
-(defvar minimal-emacs-debug (bound-and-true-p init-file-debug)
+(defvar minimal-emacs-debug nil
"Non-nil to enable debug.")
(defvar minimal-emacs-gc-cons-threshold (* 16 1024 1024)

View file

@ -14,10 +14,15 @@ stdenv.mkDerivation {
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
owner = "jamescherti"; owner = "jamescherti";
repo = "minimal-emacs.d"; repo = "minimal-emacs.d";
rev = "4b43566ec9bc9b1a68e288b955d673d0ab68ddd9"; rev = "e44aa459d5eb5af2f868dc490e4d05efca308915";
sha256 = "sha256-Z4NgOrwNXuQKIEh4Z/H324sK3zVY3AdxwOUFUSkXta4="; # rev = "08f077545a0f45a1701333406fd1afe8be77a752";
sha256 = "sha256-ABHv+TUQpBoXkg75iL2ROJoGjT+iUZQHZD9b4Z8Q4kQ=";
}; };
patches = [
./030825-init-file-debug.patch
];
installPhase = '' installPhase = ''
mkdir $out mkdir $out
cp -r * "$out/" cp -r * "$out/"