Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The live config locations on your machine are symlinked back into this repo, so
./scripts/install.sh
```

This installs `neovim`, `ghostty`, `hammerspoon`, and `zen` via Homebrew, launches Zen once to create a profile, and then runs the bootstrap step.
This installs `neovim`, `ghostty`, `hammerspoon`, and `zen` via Homebrew, ensures the Rust toolchain pieces Neovim expects are present, launches Zen once to create a profile, and then runs the bootstrap step.

## Workflow

Expand All @@ -29,10 +29,7 @@ This installs `neovim`, `ghostty`, `hammerspoon`, and `zen` via Homebrew, launch
- `configs/ghostty` -> `~/.config/ghostty`
- `configs/nvim` -> `~/.config/nvim`
- `configs/hammerspoon` -> `~/.hammerspoon`
- `configs/zen/profile/chrome` -> Zen `chrome` directory
- `configs/zen/profile/prefs.js` -> Zen `prefs.js`
- `configs/zen/profile/zen-keyboard-shortcuts.json` -> Zen keyboard shortcuts
- `configs/zen/profile/zen-themes.json` -> Zen themes config

## First-time setup on another Mac

Expand All @@ -52,6 +49,6 @@ This installs `neovim`, `ghostty`, `hammerspoon`, and `zen` via Homebrew, launch

- `bootstrap` backs up anything it replaces into `~/.dotfiles-backups/`.
- `install.sh` installs the required apps with Homebrew using `Brewfile`.
- Zen links into whichever profile is marked as the current default in `profiles.ini`.
- Zen still includes `prefs.js`, so some machine-specific browser state may come across.
- `install.sh` also ensures `rust-analyzer`, `rustfmt`, and `clippy` are available for the Neovim Rust setup.
- Zen links the keyboard shortcuts file into whichever profile is marked as the current default in `profiles.ini`.
- More detail lives in `SETUP.md`.
10 changes: 3 additions & 7 deletions SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ On a fresh Mac, run:
That script:

- installs Homebrew if it is missing
- installs `rustup` if it is missing and ensures the stable Rust toolchain editor components are available
- installs `neovim`, `ghostty`, `hammerspoon`, and `zen` from `Brewfile`
- launches Zen once so it creates a profile
- runs `./scripts/bootstrap.sh`
Expand Down Expand Up @@ -68,10 +69,7 @@ The bootstrap script links these locations:
- `configs/ghostty` -> `~/.config/ghostty`
- `configs/nvim` -> `~/.config/nvim`
- `configs/hammerspoon` -> `~/.hammerspoon`
- `configs/zen/profile/chrome` -> Zen profile `chrome` directory
- `configs/zen/profile/prefs.js` -> Zen profile `prefs.js`
- `configs/zen/profile/zen-keyboard-shortcuts.json` -> Zen keyboard shortcuts
- `configs/zen/profile/zen-themes.json` -> Zen themes config

For Zen, the script reads `~/Library/Application Support/zen/profiles.ini` and links the repo files into whichever profile is marked as the active/default one.

Expand Down Expand Up @@ -123,7 +121,8 @@ That backup contains the previous local versions of the config so you can restor

- This is a symlink-based single-repo setup.
- After bootstrap, edit the normal config paths and commit from this repo.
- Zen still includes `prefs.js`, so some machine-specific browser state may come across.
- `install.sh` also prepares the Rust tooling required by the Neovim config, including `rust-analyzer`.
- Zen only syncs the keyboard shortcuts file, so the rest of the browser profile stays machine-local.
- The old per-app git repos are no longer needed once the live paths point here.

## Repo structure
Expand All @@ -136,10 +135,7 @@ dotfiles/
nvim/
zen/
profile/
chrome/
prefs.js
zen-keyboard-shortcuts.json
zen-themes.json
scripts/
install.sh
bootstrap.sh
Expand Down
46 changes: 23 additions & 23 deletions configs/nvim/lazy-lock.json
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
{
"LazyVim": { "branch": "main", "commit": "83d90f339defdb109a6ede333865a66ffc7ef6aa" },
"SchemaStore.nvim": { "branch": "main", "commit": "7127911cc824a1d2f600492edd9667b476cf3eda" },
"blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" },
"LazyVim": { "branch": "main", "commit": "31caef21fdf4009a7d5c8342a14b7d8b97be611d" },
"SchemaStore.nvim": { "branch": "main", "commit": "2c2f2d3fb568bbff1a5e1344e87a979b7edf50a8" },
"blink.cmp": { "branch": "main", "commit": "4b18c32adef2898f95cdef6192cbd5796c1a332d" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"catppuccin": { "branch": "main", "commit": "426dbebe06b5c69fd846ceb17b42e12f890aedf1" },
"conform.nvim": { "branch": "master", "commit": "dca1a190aa85f9065979ef35802fb77131911106" },
"catppuccin": { "branch": "main", "commit": "0a5de4da015a175f416d6ef1eda84661623e0500" },
"conform.nvim": { "branch": "master", "commit": "40dcec5555f960b0a04340d76eabdf4efe78599d" },
"crates.nvim": { "branch": "main", "commit": "694357861ec9ebf12475ddcdd04ea45a0923c32d" },
"flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" },
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
"gitsigns.nvim": { "branch": "main", "commit": "dd3f588bacbeb041be6facf1742e42097f62165d" },
"grug-far.nvim": { "branch": "main", "commit": "21790e59dd0109a92a70cb874dd002af186314f5" },
"gitsigns.nvim": { "branch": "main", "commit": "9f3c6dd7868bcc116e9c1c1929ce063b978fa519" },
"grug-far.nvim": { "branch": "main", "commit": "9370422e5cdd55321c0b8c4880082c5fd4e52e99" },
"lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" },
"lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" },
"lualine.nvim": { "branch": "master", "commit": "131a558e13f9f28b15cd235557150ccb23f89286" },
"lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" },
"lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" },
"markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "51feb0ada33d18f3c5c71ffb46005dbf8b33bef4" },
"mason.nvim": { "branch": "main", "commit": "e54f5bf5f12c560da31c17eee5b3e1bd369f3ff9" },
"mini.ai": { "branch": "main", "commit": "7e10ce8468c0fce4f527ae2c0e5c484f7667f73d" },
"mini.icons": { "branch": "main", "commit": "bac6317300e205335df425296570d84322730067" },
"mini.pairs": { "branch": "main", "commit": "42387c7fe68fc0b6e95eaf37f1bb76e7bffaa0d9" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "a324581a3c83fdacdb9804b79de1cbe00ce18550" },
"mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
"mini.ai": { "branch": "main", "commit": "4b0a6207341d895b6cfe9bcb1e4d3e8607bfe4f4" },
"mini.icons": { "branch": "main", "commit": "5b9076dae1bfbe47ba4a14bc8b967cde0ab5d77e" },
"mini.pairs": { "branch": "main", "commit": "b7fde3719340946feb75017ef9d75edebdeb0566" },
"noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-lint": { "branch": "master", "commit": "eab58b48eb11d7745c11c505e0f3057165902461" },
"nvim-lspconfig": { "branch": "master", "commit": "451d4ef9abd4f0f08e379ef0d55d1c391b6125a7" },
"nvim-treesitter": { "branch": "main", "commit": "7caec274fd19c12b55902a5b795100d21531391f" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "851e865342e5a4cb1ae23d31caf6e991e1c99f1e" },
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
"nvim-lint": { "branch": "master", "commit": "606b823a57b027502a9ae00978ebf4f5d5158098" },
"nvim-lspconfig": { "branch": "master", "commit": "ead0f5f342d8d323441e7d4b88f0fc436a81ad5f" },
"nvim-treesitter": { "branch": "main", "commit": "cb2cb74f3c3cbbcc17e79cada2060165d616d849" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "a0e182ae21fda68c59d1f36c9ed45600aef50311" },
"nvim-ts-autotag": { "branch": "main", "commit": "8e1c0a389f20bf7f5b0dd0e00306c1247bda2595" },
"persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" },
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
"render-markdown.nvim": { "branch": "main", "commit": "629eb9533ec989d9d5c6cab8f3ad5372422c24e0" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"render-markdown.nvim": { "branch": "main", "commit": "1c958131c083c8557ea499fdb08c88b8afb05c4e" },
"rustaceanvim": { "branch": "main", "commit": "524d8bedd31c0e5ca6de4fa344750401d109c0af" },
"snacks.nvim": { "branch": "main", "commit": "ad9ede6a9cddf16cedbd31b8932d6dcdee9b716e" },
"snacks.nvim": { "branch": "main", "commit": "9912042fc8bca2209105526ac7534e9a0c2071b2" },
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
"tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" },
"tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" },
"trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
"ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" },
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
Expand Down
2 changes: 2 additions & 0 deletions configs/nvim/lazyvim.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"extras": [
"lazyvim.plugins.extras.formatting.prettier",
"lazyvim.plugins.extras.lang.go",
"lazyvim.plugins.extras.lang.json",
"lazyvim.plugins.extras.lang.markdown",
"lazyvim.plugins.extras.lang.typescript",
"lazyvim.plugins.extras.linting.eslint",
"lazyvim.plugins.extras.lang.yaml"
],
"install_version": 8,
Expand Down
5 changes: 5 additions & 0 deletions configs/nvim/lua/config/keymaps.lua
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,10 @@ map("n", "<A-BS>", "db", { desc = "Delete previous word" })

map("n", "G", "Gzz", { desc = "Goto line centered" })
map("n", "gg", "ggzz", { desc = "Goto first line centered" })
map("n", "g+", ":+", { desc = "Goto relative line forward" })
map("n", "g-", ":-", { desc = "Goto relative line backward" })
map("n", "<S-Down>", "<C-d>zz", { desc = "Half page down centered" })
map("n", "<S-Up>", "<C-u>zz", { desc = "Half page up centered" })
map("n", "n", "nzzzv", { desc = "Next search result centered" })
map("n", "N", "Nzzzv", { desc = "Previous search result centered" })
map("n", "rr", vim.lsp.buf.rename, { desc = "Rename" })
3 changes: 2 additions & 1 deletion configs/nvim/lua/config/lazy.lua
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ require("lazy").setup({
spec = {
-- add LazyVim and import its plugins
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
{ import = "lazyvim.plugins.extras.lang.rust" },
-- import/override with your plugins
{ import = "plugins" },
},
Expand All @@ -30,7 +31,7 @@ require("lazy").setup({
version = false, -- always use the latest git commit
-- version = "*", -- try installing the latest stable version for plugins that support semver
},
install = { colorscheme = { "tokyonight", "habamax" } },
install = { colorscheme = { "vscode", "habamax" } },
checker = {
enabled = true, -- check for plugin updates periodically
notify = false, -- notify on update
Expand Down
12 changes: 12 additions & 0 deletions configs/nvim/lua/plugins/blink.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,25 @@ return {
"saghen/blink.cmp",
opts = {
completion = {
keyword = {
range = "full",
},
list = {
selection = {
auto_insert = false,
},
},
menu = {
auto_show = true,
},
ghost_text = {
enabled = false,
},
},
keymap = {
preset = "enter",
["<CR>"] = { "select_and_accept", "fallback" },
},
},
},
}
12 changes: 12 additions & 0 deletions configs/nvim/lua/plugins/multicursor.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
return {
{
'mg979/vim-visual-multi',
branch = 'master',
init = function()
vim.g.VM_maps = {
['Find Under'] = '<D-d>',
['Find Subword Under'] = '<D-d>',
}
end,
},
}
3 changes: 0 additions & 3 deletions configs/nvim/lua/plugins/rust.lua

This file was deleted.

45 changes: 45 additions & 0 deletions configs/nvim/lua/plugins/snacks.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
return {
{
"folke/snacks.nvim",
keys = {
{
"<leader>e",
function()
local picker = Snacks.picker.get({ source = "explorer" })[1]
if picker and not picker.closed then
picker:focus("list")
else
Snacks.explorer({ cwd = LazyVim.root() })
end
end,
desc = "Focus Explorer",
},
},
opts = {
picker = {
sources = {
files = {
hidden = true,
ignored = true,
exclude = { "node_modules" },
},
grep = {
hidden = true,
ignored = true,
exclude = { "node_modules" },
},
grep_word = {
hidden = true,
ignored = true,
exclude = { "node_modules" },
},
explorer = {
hidden = true,
ignored = true,
exclude = { "node_modules" },
},
},
},
},
},
}
18 changes: 18 additions & 0 deletions configs/nvim/lua/plugins/theme.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
return {
{
'Mofiqul/vscode.nvim',
priority = 1000,
opts = {
style = 'dark',
transparent = false,
italic_comments = false,
disable_nvimtree_bg = true,
},
},
{
'LazyVim/LazyVim',
opts = {
colorscheme = 'vscode',
},
},
}
27 changes: 27 additions & 0 deletions configs/nvim/lua/plugins/typescript-tools.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
return {
{
'stevearc/conform.nvim',
optional = true,
opts = function(_, opts)
opts.formatters_by_ft = opts.formatters_by_ft or {}

for _, ft in ipairs({ 'javascript', 'javascriptreact', 'typescript', 'typescriptreact' }) do
opts.formatters_by_ft[ft] = { 'prettier' }
end
end,
},
{
'neovim/nvim-lspconfig',
optional = true,
opts = {
servers = {
eslint = {
settings = {
workingDirectories = { mode = 'auto' },
format = true,
},
},
},
},
},
}
2 changes: 1 addition & 1 deletion configs/zen/profile/chrome/zen-themes.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Zen Mods - Generated by ZenMods.
* FILE GENERATED AT: Saturday, May 9, 2026 at 5:57:52 PM British Summer Time
* FILE GENERATED AT: Friday, May 15, 2026 at 3:53:07 PM British Summer Time
* DO NOT EDIT THIS FILE DIRECTLY!
* Your changes will be overwritten.
* Instead, go to the preferences and edit the mods there.
Expand Down
Loading