.
This commit is contained in:
commit
73ff9ee8ee
31 changed files with 4906 additions and 0 deletions
32
home/bin/tmux-sessionizer
Executable file
32
home/bin/tmux-sessionizer
Executable file
|
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if [[ $# -eq 1 ]]; then
|
||||
selected=$1
|
||||
else
|
||||
selected=$(
|
||||
(
|
||||
find ~/work -mindepth 1 -maxdepth 1 -type d
|
||||
find ~/dev -mindepth 2 -maxdepth 2 -type d
|
||||
find ~/dev/icefox/php -mindepth 1 -maxdepth 1 -type d
|
||||
) | fzf
|
||||
)
|
||||
|
||||
fi
|
||||
|
||||
if [[ -z $selected ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
selected_name=$(basename "$selected" | tr . _)
|
||||
tmux_running=$(pgrep tmux)
|
||||
|
||||
if [[ -z $TMUX ]] && [[ -z $tmux_running ]]; then
|
||||
tmux new-session -s "$selected_name" -c "$selected"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! tmux has-session -t="$selected_name" 2> /dev/null; then
|
||||
tmux new-session -ds "$selected_name" -c "$selected"
|
||||
fi
|
||||
|
||||
tmux switch-client -t "$selected_name"
|
||||
3
home/default.nix
Normal file
3
home/default.nix
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{ ... }:
|
||||
{
|
||||
}
|
||||
0
home/files/lf/lfrc
Normal file
0
home/files/lf/lfrc
Normal file
416
home/nvim/default.nix
Normal file
416
home/nvim/default.nix
Normal file
|
|
@ -0,0 +1,416 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.custom.neovim;
|
||||
in
|
||||
{
|
||||
options.custom.neovim = {
|
||||
enable = mkEnableOption "Custom Neovim";
|
||||
|
||||
colorscheme = mkOption {
|
||||
type = types.str;
|
||||
default = "unokai";
|
||||
};
|
||||
|
||||
hostname = mkOption {
|
||||
type = types.str;
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
programs.neovim = {
|
||||
enable = true;
|
||||
defaultEditor = true;
|
||||
viAlias = true;
|
||||
vimAlias = false;
|
||||
vimdiffAlias = true;
|
||||
plugins = with pkgs.vimPlugins; [
|
||||
{
|
||||
plugin = auto-session;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("auto-session").setup({
|
||||
cwd_change_handling = true,
|
||||
suppressed_dirs = { "$HOME", "/etc/nixos", "$HOME/tmp" },
|
||||
})
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = blink-cmp;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("blink.cmp").setup({
|
||||
completion = {
|
||||
documentation = {
|
||||
auto_show = true
|
||||
},
|
||||
},
|
||||
keymap = {
|
||||
preset = "default",
|
||||
["<C-y>"] = { "snippet_forward", "fallback" },
|
||||
["<C-s>"] = { "select_and_accept", "snippet_forward", "fallback" },
|
||||
["<C-S-y>"] = { "snippet_backward", "fallback" },
|
||||
},
|
||||
})
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = comment-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require('Comment').setup()
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = conform-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("conform").setup({
|
||||
formatters_by_ft = {
|
||||
c = { "clang-format" },
|
||||
cpp = { "clang-format" },
|
||||
lua = { "stylua" },
|
||||
javascript = { "prettierd" },
|
||||
nix = { "nixfmt" },
|
||||
python = { "black" },
|
||||
php = { "php_cs_fixer" },
|
||||
zig = { "zigfmt" },
|
||||
css = { "prettierd" },
|
||||
scss = { "prettierd" },
|
||||
less = { "prettierd" },
|
||||
blade = { "blade-formatter" },
|
||||
go = { "gofmt" },
|
||||
wgsl = { "wgsl_fmt" },
|
||||
},
|
||||
})
|
||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||
pattern = "*",
|
||||
callback = function(args)
|
||||
require("conform").format({ bufnr = args.buf })
|
||||
end,
|
||||
})
|
||||
vim.keymap.set("n", "<leader>rf", function()
|
||||
require("conform").format({
|
||||
lsp_fallback = true,
|
||||
async = true,
|
||||
timeout_ms = 500,
|
||||
})
|
||||
end, { desc = "conform format" })
|
||||
'';
|
||||
}
|
||||
leap-nvim
|
||||
{
|
||||
plugin = lsp_lines-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("lsp_lines").setup()
|
||||
vim.keymap.set("n", "<localleader>i", require("lsp_lines").toggle, { desc = "Toggle LSP lines" })
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = mini-icons;
|
||||
type = "lua";
|
||||
config = ''require("mini.icons").setup()'';
|
||||
}
|
||||
{
|
||||
plugin = neotest;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require('neotest').setup({
|
||||
output = {
|
||||
open_on_run = true
|
||||
},
|
||||
adapters = {
|
||||
require('neotest-pest'),
|
||||
}
|
||||
})
|
||||
vim.keymap.set('n', '<localleader>pn', function() require('neotest').run.run() end, { desc = "test nearest" })
|
||||
vim.keymap.set('n', '<localleader>pe', function() require('neotest').run.run(vim.fn.expand('%')) end, { desc = "test file" })
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = neotest-pest;
|
||||
type = "lua";
|
||||
}
|
||||
# {
|
||||
# plugin = nvim-autopairs;
|
||||
# type = "lua";
|
||||
# config = ''
|
||||
# require('nvim-autopairs').setup()
|
||||
# '';
|
||||
# }
|
||||
{
|
||||
plugin = nvim-dap;
|
||||
type = "lua";
|
||||
config = ''
|
||||
local dap = require("dap")
|
||||
dap.adapters.php = {
|
||||
type = 'executable',
|
||||
command = '${pkgs.nodejs}/bin/node',
|
||||
args = { '${pkgs.vscode-extensions.xdebug.php-debug}/share/vscode/extensions/xdebug.php-debug/out/phpDebug.js' },
|
||||
}
|
||||
|
||||
dap.configurations.php = {
|
||||
{
|
||||
type = 'php',
|
||||
request = 'launch',
|
||||
name = 'listen for xdebug',
|
||||
port = 9003,
|
||||
}
|
||||
}
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = nvim-dap-ui;
|
||||
type = "lua";
|
||||
config = ''
|
||||
local dapui = require("dapui")
|
||||
dapui.setup()
|
||||
dap.listeners.before.attach.dapui_config = function()
|
||||
dapui.open()
|
||||
end
|
||||
dap.listeners.before.launch.dapui_config = function()
|
||||
dapui.open()
|
||||
end
|
||||
dap.listeners.before.event_terminated.dapui_config = function()
|
||||
dapui.close()
|
||||
end
|
||||
dap.listeners.before.event_exited.dapui_config = function()
|
||||
dapui.close()
|
||||
end
|
||||
'';
|
||||
}
|
||||
nvim-nio
|
||||
{
|
||||
plugin = nvim-treesitter.withAllGrammars;
|
||||
type = "lua";
|
||||
config = ''
|
||||
local treesitter = require("nvim-treesitter")
|
||||
treesitter.setup()
|
||||
vim.api.nvim_create_autocmd('FileType', {
|
||||
pattern = {
|
||||
'c', 'lua', 'vim', 'vimdoc', 'query', 'elixir', 'heex', 'javascript', 'typescript',
|
||||
'html', 'yaml', 'blade', 'php', 'scss', 'comment', 'cmake' , 'dockerfile', 'fish',
|
||||
'fsharp', 'git_config', 'git_rebase', 'gitignore', 'glsl', 'go', 'gomod', 'graphql',
|
||||
'haskell', 'hlsl', 'http', 'ini', 'javadoc', 'jq', 'jsdoc', 'json', 'json5', 'kitty',
|
||||
'latex', 'markdown', 'nginx', 'nix', 'php', 'php_only', 'phpdoc', 'regex', 'rust', 'sql',
|
||||
'ssh_config', 'tmux', 'vim', 'wgsl', 'yaml', 'zig', 'ols',
|
||||
},
|
||||
callback = function()
|
||||
vim.treesitter.start()
|
||||
end,
|
||||
})
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = nvim-treesitter-context;
|
||||
type = "lua";
|
||||
config = ''require("treesitter-context").setup()'';
|
||||
}
|
||||
# {
|
||||
# plugin = nvim-treesitter-textobjectse
|
||||
# type = "lua";
|
||||
# config = ''
|
||||
# vim.g.no_plugin_maps = true
|
||||
# require("treesitter-textobjects").setup()
|
||||
# '';
|
||||
# }
|
||||
nvim-lspconfig
|
||||
nvim-nio
|
||||
{
|
||||
plugin = nvim-surround;
|
||||
type = "lua";
|
||||
config = ''require("nvim-surround").setup()'';
|
||||
}
|
||||
{
|
||||
plugin = nvim-web-devicons;
|
||||
type = "lua";
|
||||
config = ''require("nvim-web-devicons").setup()'';
|
||||
}
|
||||
{
|
||||
plugin = oil-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("oil").setup()
|
||||
vim.keymap.set("n", "<leader>o", "<cmd>Oil<cr>", { desc = "Oil" })
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = opencode-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
vim.o.autoread = true
|
||||
-- Recommended/example keymaps.
|
||||
vim.keymap.set({ "n", "x" }, "<C-a>", function() require("opencode").ask("@this: ", { submit = true }) end, { desc = "Ask opencode…" })
|
||||
vim.keymap.set({ "n", "x" }, "<C-x>", function() require("opencode").select() end, { desc = "Execute opencode action…" })
|
||||
vim.keymap.set({ "n", "t" }, "<C-.>", function() require("opencode").toggle() end, { desc = "Toggle opencode" })
|
||||
|
||||
vim.keymap.set({ "n", "x" }, "go", function() return require("opencode").operator("@this ") end, { desc = "Add range to opencode", expr = true })
|
||||
vim.keymap.set("n", "goo", function() return require("opencode").operator("@this ") .. "_" end, { desc = "Add line to opencode", expr = true })
|
||||
|
||||
vim.keymap.set("n", "<S-C-u>", function() require("opencode").command("session.half.page.up") end, { desc = "Scroll opencode up" })
|
||||
vim.keymap.set("n", "<S-C-d>", function() require("opencode").command("session.half.page.down") end, { desc = "Scroll opencode down" })
|
||||
|
||||
-- You may want these if you stick with the opinionated "<C-a>" and "<C-x>" above — otherwise consider "<leader>o…".
|
||||
vim.keymap.set("n", "+", "<C-a>", { desc = "Increment under cursor", noremap = true })
|
||||
vim.keymap.set("n", "-", "<C-x>", { desc = "Decrement under cursor", noremap = true })
|
||||
'';
|
||||
}
|
||||
phpactor
|
||||
plenary-nvim
|
||||
{
|
||||
plugin = render-markdown-nvim;
|
||||
type = "lua";
|
||||
config = ''require("render-markdown").setup()'';
|
||||
}
|
||||
{
|
||||
plugin = snacks-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
local snacks = require("snacks")
|
||||
snacks.setup({
|
||||
bigfile = {},
|
||||
dim = {},
|
||||
image = {},
|
||||
indent = {},
|
||||
lazygit = {},
|
||||
picker = {
|
||||
win = {
|
||||
input = {
|
||||
keys = {
|
||||
["<Esc>"] = { "close", mode = { "n", "i" } },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
quickfile = {},
|
||||
notifier = {},
|
||||
})
|
||||
vim.keymap.set({ "n" }, "<localleader>t", snacks.picker.grep, { desc = "grep picker" })
|
||||
vim.keymap.set({ "n" }, "<localleader>r", snacks.picker.buffers, { desc = "buffer picker" })
|
||||
vim.keymap.set({ "n" }, "<localleader>s", snacks.picker.files, { desc = "file picker" })
|
||||
vim.keymap.set({ "n" }, "<localleader>ln", snacks.picker.lsp_references, { desc = "lsp references" })
|
||||
vim.keymap.set("n", "<localleader>le", snacks.picker.lsp_implementations, { desc = "lsp implementations" })
|
||||
-- vim.keymap.set("n", "<leader>lg", function() snacks.lazygit() end , { desc = "lazygit" })
|
||||
'';
|
||||
}
|
||||
rose-pine
|
||||
{
|
||||
plugin = rustaceanvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
vim.keymap.set("n", "<leader>da", function() vim.cmd.RustLsp('codeAction') end, { silent = true, buffer = bufnr })
|
||||
vim.keymap.set("n", "K", function() vim.cmd.RustLsp({'hover', 'actions'}) end, { silent = true, buffer = bufnr })
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = tabby-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("tabby").setup({
|
||||
preset = "active_wins_at_tail",
|
||||
options = {
|
||||
theme = {
|
||||
fill = "TabLineFill",
|
||||
head = "TabLine",
|
||||
current_tab = "TabLineSel",
|
||||
tab = "TabLine",
|
||||
win = "TabLine",
|
||||
tail = "TabLine",
|
||||
},
|
||||
nerdfont = true,
|
||||
lualine_theme = nil,
|
||||
tab_name = {
|
||||
name_fallback = function(tabid)
|
||||
return tabid
|
||||
end,
|
||||
},
|
||||
buf_name = { mode = "unique", },
|
||||
},
|
||||
})
|
||||
vim.keymap.set("n", "<leader>to", "<cmd>Tabby jump_to_tab<cr>", { desc = "Jump to tab" })
|
||||
vim.keymap.set("n", "<leader>tf", "<cmd>Tabby pick_window<cr>", { desc = "Search tab" })
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = ts-autotag-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("ts-autotag").setup()
|
||||
'';
|
||||
}
|
||||
# {
|
||||
# plugin = toggleterm-nvim;
|
||||
# type = "lua";
|
||||
# config = ''
|
||||
# require("toggleterm").setup()
|
||||
# vim.keymap.set("n", "<leader>nt", "<cmd>ToggleTerm size=120 direction=tab name=ttermh<cr>", { desc = "Toggle tterm tab" })
|
||||
# vim.keymap.set("n", "<leader>ns", "<cmd>ToggleTerm direction=vertical name=ttermv<cr>", { desc = "Toggle tterm vertical" })
|
||||
# vim.keymap.set("n", "<C-n>", "<cmd>ToggleTerm direction=float name=ttermf<cr>", { desc = "Toggle tterm float" })
|
||||
# '';
|
||||
# }
|
||||
{
|
||||
plugin = trouble-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("trouble").setup({})
|
||||
vim.keymap.set("n", "<localleader>id", "<cmd>Trouble diagnostics toggle<cr>", { desc = "Trouble project" })
|
||||
-- vim.keymap.set("n", "<localleader>io", "<cmd>Trouble diagnostics toggle filter.buf=0<cr>", { desc = "Trouble buffer" })
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = undotree;
|
||||
type = "lua";
|
||||
config = ''vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle, { desc = "undotree" })'';
|
||||
}
|
||||
vim-repeat
|
||||
{
|
||||
plugin = vimtex;
|
||||
type = "lua";
|
||||
config = ''
|
||||
vim.g.vimtex_view_method = "zathura"
|
||||
vim.g.vimtex_compiler_method = "latexmk"
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = which-key-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
local wk = require("which-key")
|
||||
wk.setup({
|
||||
preset = "helix",
|
||||
win = { row = 0, col = 0.5 },
|
||||
triggers = {
|
||||
{ "<leader>", mode = { "n", "v" } },
|
||||
{ "<localleader>", mode = { "n", "v" } },
|
||||
}
|
||||
})
|
||||
wk.add({
|
||||
{ "<leader>s", group = "Search..." },
|
||||
{ "<leader>l", group = "Launch..." },
|
||||
{ "<leader>t", group = "Tab..." },
|
||||
{ "<leader>g", group = "Go..." },
|
||||
{ "<leader>r", group = "Run..." },
|
||||
{ "<leader>n", group = "term..." },
|
||||
})
|
||||
-- vim.keymap.set({"t"}, "<C-/>", wk.show, { desc = "Show which key in terminal mode" })
|
||||
'';
|
||||
}
|
||||
vim-fugitive
|
||||
];
|
||||
extraConfig = ''
|
||||
colorscheme ${cfg.colorscheme}
|
||||
'';
|
||||
extraLuaConfig = ''
|
||||
${builtins.readFile ./settings.lua}
|
||||
${builtins.replaceStrings [ "@HOSTNAME@" ] [ cfg.hostname ] (builtins.readFile ./plugins.lua)}
|
||||
require("custom")
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
161
home/nvim/plugins.lua
Normal file
161
home/nvim/plugins.lua
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
local hostname = "@HOSTNAME@"
|
||||
|
||||
local servers = {
|
||||
clangd = {},
|
||||
textlab = {},
|
||||
lua_ls = {
|
||||
settings = {
|
||||
Lua = {
|
||||
runtime = {
|
||||
version = "LuaJIT",
|
||||
},
|
||||
diagnostics = {
|
||||
globals = { "vim" },
|
||||
},
|
||||
workspace = {
|
||||
library = vim.api.nvim_get_runtime_file("", true),
|
||||
checkThirdParty = false,
|
||||
},
|
||||
telemetry = {
|
||||
enable = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
nixd = {
|
||||
nixpkgs = {
|
||||
expr = 'import (builtins.getFlake "/etc/nixos").inputs.nixpkgs {}',
|
||||
},
|
||||
formatting = { command = { "nixfmt" } },
|
||||
options = {
|
||||
nixos = {
|
||||
expr = '(builtins.getFlake "/etc/nixos").nixosConfigurations.' .. hostname .. ".options",
|
||||
},
|
||||
home_manager = {
|
||||
expr = '(builtins.getFlake "/etc/nixos").homeConfigurations.' .. hostname .. ".options",
|
||||
},
|
||||
},
|
||||
},
|
||||
phpactor = {},
|
||||
zls = {
|
||||
settings = {
|
||||
zls = {
|
||||
enable_build_on_save = true,
|
||||
semantic_tokens = "partial",
|
||||
},
|
||||
},
|
||||
},
|
||||
css = {},
|
||||
scss = {},
|
||||
less = {},
|
||||
blade = {},
|
||||
html = { filetypes = { "html", "blade" } },
|
||||
htmx = { filetypes = { "html", "blade" } },
|
||||
gopls = {},
|
||||
ols = {},
|
||||
wgsl_analyzer = {},
|
||||
}
|
||||
for server, config in pairs(servers) do
|
||||
vim.lsp.config(server, config)
|
||||
vim.lsp.enable(server)
|
||||
end
|
||||
|
||||
-- vim.api.nvim_create_autocmd("LspAttach", {
|
||||
-- group = vim.api.nvim_create_augroup("UserConfigLsp", {}),
|
||||
-- callback = function(ev)
|
||||
vim.keymap.set("n", "gn", vim.lsp.buf.declaration, { desc = "go to declaration" })
|
||||
vim.keymap.set("n", "ge", vim.lsp.buf.definition, { desc = "go to definition" })
|
||||
-- vim.keymap.set("n", "gi", vim.lsp.buf.implementaion, { desc = "go to implementation" })
|
||||
vim.keymap.set("n", "<leader>rr", vim.lsp.buf.rename, { desc = "lsp rename" })
|
||||
vim.keymap.set("n", "<leader>ra", vim.lsp.buf.code_action, { desc = "code action" })
|
||||
vim.keymap.set({ "n", "i" }, "<C-k>", vim.lsp.buf.signature_help, { desc = "signature help" })
|
||||
vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "references" })
|
||||
-- end,
|
||||
-- })
|
||||
|
||||
local leap = require("leap")
|
||||
leap.opts.preview = function(ch0, ch1, ch2)
|
||||
return not (ch1:match("%s") or (ch0:match("%a") and ch1:match("%a") and ch2:match("%a")))
|
||||
end
|
||||
leap.opts.equivalence_classes = {
|
||||
" \t\r\n",
|
||||
"([{",
|
||||
")]}",
|
||||
"'\"`",
|
||||
}
|
||||
vim.api.nvim_set_hl(0, "LeapBackdrop", { link = "Comment" })
|
||||
|
||||
do
|
||||
-- Return an argument table for `leap()`, tailored for f/t-motions.
|
||||
local function as_ft(key_specific_args)
|
||||
local common_args = {
|
||||
inputlen = 1,
|
||||
inclusive = true,
|
||||
-- To limit search scope to the current line:
|
||||
-- pattern = function (pat) return '\\%.l'..pat end,
|
||||
opts = {
|
||||
labels = "", -- force autojump
|
||||
safe_labels = vim.fn.mode(1):match("[no]") and "" or nil, -- [1]
|
||||
},
|
||||
}
|
||||
return vim.tbl_deep_extend("keep", common_args, key_specific_args)
|
||||
end
|
||||
|
||||
local clever = require("leap.user").with_traversal_keys -- [2]
|
||||
local clever_f = clever("f", "F")
|
||||
local clever_t = clever("t", "T")
|
||||
|
||||
for key, key_specific_args in pairs({
|
||||
f = { opts = clever_f },
|
||||
F = { backward = true, opts = clever_f },
|
||||
t = { offset = -1, opts = clever_t },
|
||||
T = { backward = true, offset = 1, opts = clever_t },
|
||||
}) do
|
||||
vim.keymap.set({ "n", "x", "o" }, key, function()
|
||||
require("leap").leap(as_ft(key_specific_args))
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
vim.api.nvim_create_autocmd("CmdlineLeave", {
|
||||
group = vim.api.nvim_create_augroup("LeapOnSearch", {}),
|
||||
callback = function()
|
||||
local ev = vim.v.event
|
||||
local is_search_cmd = (ev.cmdtype == "/") or (ev.cmdtype == "?")
|
||||
local cnt = vim.fn.searchcount().total
|
||||
if is_search_cmd and not ev.abort and (cnt > 1) then
|
||||
-- Allow CmdLineLeave-related chores to be completed before
|
||||
-- invoking Leap.
|
||||
vim.schedule(function()
|
||||
-- We want "safe" labels, but no auto-jump (as the search
|
||||
-- command already does that), so just use `safe_labels`
|
||||
-- as `labels`, with n/N removed.
|
||||
local labels = require("leap").opts.safe_labels:gsub("[nN]", "")
|
||||
-- For `pattern` search, we never need to adjust conceallevel
|
||||
-- (no user input). We cannot merge `nil` from a table, but
|
||||
-- using the option's current value has the same effect.
|
||||
local vim_opts = { ["wo.conceallevel"] = vim.wo.conceallevel }
|
||||
require("leap").leap({
|
||||
pattern = vim.fn.getreg("/"), -- last search pattern
|
||||
windows = { vim.fn.win_getid() },
|
||||
opts = { safe_labels = "", labels = labels, vim_opts = vim_opts },
|
||||
})
|
||||
end)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
vim.keymap.set({ "n", "x", "o" }, "s", "<Plug>(leap)", { desc = "leap" })
|
||||
vim.keymap.set({ "n", "x", "o" }, "S", "<Plug>(leap-from-window)", { desc = "leap across window" })
|
||||
|
||||
require("neotest").setup({
|
||||
adapters = {
|
||||
require("neotest-pest"),
|
||||
},
|
||||
})
|
||||
vim.keymap.set("n", "<localleader>pn", function()
|
||||
require("neotest").run.run()
|
||||
end, { desc = "test nearest" })
|
||||
vim.keymap.set("n", "<localleader>pe", function()
|
||||
require("neotest").run.run(vim.fn.expand("%"))
|
||||
end, { desc = "test file" })
|
||||
147
home/nvim/settings.lua
Normal file
147
home/nvim/settings.lua
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
vim.opt.number = true
|
||||
vim.opt.relativenumber = true
|
||||
vim.opt.cursorline = true
|
||||
vim.opt.wrap = false
|
||||
vim.opt.scrolloff = 10
|
||||
vim.opt.sidescrolloff = 8
|
||||
|
||||
vim.opt.tabstop = 4
|
||||
vim.opt.shiftwidth = 4
|
||||
vim.opt.softtabstop = 4
|
||||
vim.opt.expandtab = true
|
||||
vim.opt.smartindent = true
|
||||
vim.opt.autoindent = true
|
||||
|
||||
vim.opt.ignorecase = true
|
||||
vim.opt.smartcase = true
|
||||
vim.opt.hlsearch = false
|
||||
vim.opt.incsearch = true
|
||||
|
||||
vim.opt.termguicolors = true
|
||||
vim.opt.signcolumn = "yes"
|
||||
vim.opt.colorcolumn = "120"
|
||||
vim.opt.showmatch = false
|
||||
--- vim.opt.matchtime = 2
|
||||
vim.opt.conceallevel = 0
|
||||
vim.opt.concealcursor = ""
|
||||
vim.opt.synmaxcol = 1000
|
||||
vim.opt.isfname:append("@-@")
|
||||
|
||||
vim.opt.backup = false
|
||||
vim.opt.writebackup = false
|
||||
vim.opt.swapfile = false
|
||||
vim.opt.undofile = true
|
||||
vim.opt.undodir = vim.fn.expand("~/.cache/vim/undodir")
|
||||
vim.opt.updatetime = 100
|
||||
vim.opt.timeoutlen = 500
|
||||
vim.opt.ttimeoutlen = 0
|
||||
vim.opt.autoread = true
|
||||
vim.opt.autowrite = false
|
||||
|
||||
vim.opt.hidden = true
|
||||
--- vim.opt.errorbells = false
|
||||
vim.opt.backspace = "indent,eol,start"
|
||||
vim.opt.autochdir = false
|
||||
vim.opt.path:append("**")
|
||||
vim.opt.selection = "exclusive"
|
||||
vim.opt.mouse = "a"
|
||||
vim.opt.modifiable = true
|
||||
vim.opt.encoding = "UTF-8"
|
||||
|
||||
-- Split behavior
|
||||
vim.opt.splitbelow = true
|
||||
vim.opt.splitright = true
|
||||
|
||||
vim.g.mapleader = " "
|
||||
vim.g.maplocalleader = vim.api.nvim_replace_termcodes("<BS>", false, false, true)
|
||||
|
||||
vim.o.exrc = true
|
||||
vim.o.showtabline = 2
|
||||
|
||||
vim.cmd("set title")
|
||||
vim.cmd("set ic")
|
||||
|
||||
-- Delete without yanking
|
||||
vim.keymap.set({ "n", "v" }, "<localleader>d", '"_d', { desc = "Delete without yanking" })
|
||||
vim.keymap.set({ "n", "v" }, "<C-c>", '"+y', { desc = "Copy to clipboard" })
|
||||
vim.keymap.set("x", "<localleader>p", '"_dP', { desc = "Replace without yanking" })
|
||||
|
||||
-- Wayland clipboard mappings
|
||||
vim.keymap.set({ "n", "v" }, "<leader>y", '"+y', { desc = "Yank to system clipboard" })
|
||||
vim.keymap.set("n", "<leader>Y", '"+Y', { desc = "Yank line to system clipboard" })
|
||||
vim.keymap.set({ "n", "v" }, "<leader>p", '"+p', { desc = "Paste from system clipboard" })
|
||||
vim.keymap.set({ "n", "v" }, "<leader>P", '"+P', { desc = "Paste from system clipboard before cursor" })
|
||||
|
||||
-- Better J behavior
|
||||
vim.keymap.set("n", "J", "mzJ`z", { desc = "Join lines and keep cursor position" })
|
||||
|
||||
--- center when jumping
|
||||
vim.keymap.set("n", "n", "nzzzv", { desc = "Next search result (centered)" })
|
||||
vim.keymap.set("n", "N", "Nzzzv", { desc = "Previous search result (centered)" })
|
||||
vim.keymap.set("n", "<C-d>", "<C-d>zz", { desc = "Half page down (centered)" })
|
||||
vim.keymap.set("n", "<C-u>", "<C-u>zz", { desc = "Half page up (centered)" })
|
||||
|
||||
--- window navigation
|
||||
vim.keymap.set("n", "<C-w>Left", "<C-w>h", { desc = "Move to left window" })
|
||||
vim.keymap.set("n", "<C-w>Right", "<C-w>l", { desc = "Move to right window" })
|
||||
vim.keymap.set("n", "<C-w>Top", "<C-w>k", { desc = "Move to top window" })
|
||||
vim.keymap.set("n", "<C-w>Down", "<C-w>j", { desc = "Move to bottom window" })
|
||||
|
||||
vim.keymap.set("t", "<S-Esc>", "<C-\\><C-n>", { desc = "Exit terminal mode" })
|
||||
|
||||
vim.keymap.set("n", "<leader>tn", "<cmd>$tabnew<cr>", { desc = "create tab" })
|
||||
vim.keymap.set("n", "<leader>n", function()
|
||||
vim.cmd("tabnext 1")
|
||||
end, { desc = "Go to tab 1" })
|
||||
vim.keymap.set("n", "<leader>e", function()
|
||||
vim.cmd("tabnext 2")
|
||||
end, { desc = "Go to tab 2" })
|
||||
vim.keymap.set("n", "<leader>i", function()
|
||||
vim.cmd("tabnext 3")
|
||||
end, { desc = "Go to tab 3" })
|
||||
vim.keymap.set("n", "<leader>a", function()
|
||||
vim.cmd("tabnext 4")
|
||||
end, { desc = "Go to tab 4" })
|
||||
vim.keymap.set({ "n", "t" }, "<C-H>", function()
|
||||
vim.cmd("tabnext #")
|
||||
end, { desc = "Go to previous tab" })
|
||||
vim.keymap.set({ "n", "t" }, "<C-Space>", "<C-w>p", { desc = "Go to previous pane" })
|
||||
|
||||
vim.keymap.set("n", "<localleader>v", "<cmd>vsplit<cr>", { desc = "split (vertical line)" })
|
||||
vim.keymap.set("n", "<leader>h", "<cmd>split<cr>", { desc = "split (horizontal line)" })
|
||||
|
||||
vim.keymap.set("n", "<localleader><localleader>", "<cmd>w<cr>", { desc = "save buffer" })
|
||||
|
||||
vim.diagnostic.config({
|
||||
virtual_text = false,
|
||||
virtual_lines = true,
|
||||
signs = true,
|
||||
underline = true,
|
||||
update_in_insert = false,
|
||||
severity_sort = true,
|
||||
})
|
||||
|
||||
-- Highlight yanked text
|
||||
vim.api.nvim_create_autocmd("TextYankPost", {
|
||||
group = augroup,
|
||||
callback = function()
|
||||
vim.highlight.on_yank()
|
||||
end,
|
||||
})
|
||||
|
||||
--- return to last edit position when opening files
|
||||
vim.api.nvim_create_autocmd("BufReadPost", {
|
||||
group = augroup,
|
||||
callback = function()
|
||||
local mark = vim.api.nvim_buf_get_mark(0, '"')
|
||||
local lcount = vim.api.nvim_buf_line_count(0)
|
||||
if mark[1] > 0 and mark[1] <= lcount then
|
||||
pcall(vim.api.nvim_win_set_cursor, 0, mark)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
--- command line completion
|
||||
vim.opt.wildmenu = true
|
||||
vim.opt.wildmode = "longest:full,full"
|
||||
vim.opt.wildignore:append({ "*.o", "*.obj", "*.pyc", "*.class", "*.jar", "*.lock" })
|
||||
91
home/root.nix
Normal file
91
home/root.nix
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
{ hostname, ... }:
|
||||
{
|
||||
home-manager.users.root =
|
||||
{ config, ... }:
|
||||
{
|
||||
imports = [ ./nvim ];
|
||||
home.username = "root";
|
||||
home.homeDirectory = "/root";
|
||||
home.stateVersion = "25.11";
|
||||
home.enableNixpkgsReleaseCheck = false;
|
||||
|
||||
home.file."/.ssh/desktop.pub".text =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILquARrJ3Vyh5z6aeVoiYrkLpgiMts+V/JzFEvs3Cnth root@icefox.sh";
|
||||
|
||||
xdg.userDirs = {
|
||||
enable = false;
|
||||
extraConfig = {
|
||||
XDG_CACHE_HOME = "${config.home.homeDirectory}/.cache";
|
||||
};
|
||||
};
|
||||
|
||||
programs = {
|
||||
ssh = {
|
||||
enable = true;
|
||||
enableDefaultConfig = false;
|
||||
matchBlocks = {
|
||||
"icefox.sh" = {
|
||||
user = "git";
|
||||
identityFile = "/root/.ssh/desktop";
|
||||
};
|
||||
};
|
||||
};
|
||||
delta = {
|
||||
enable = true;
|
||||
options = {
|
||||
navigate = true;
|
||||
line-numbers = true;
|
||||
side-by-side = true;
|
||||
};
|
||||
enableGitIntegration = true;
|
||||
};
|
||||
git = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
settings = {
|
||||
user = {
|
||||
email = "root@icefox.sh";
|
||||
name = "root";
|
||||
};
|
||||
gpg.format = "ssh";
|
||||
user.signingkey = "${config.home.homeDirectory}/.ssh/desktop.pub";
|
||||
commit.gpgsign = true;
|
||||
tag.gpgsign = true;
|
||||
core = {
|
||||
editor = "nvim";
|
||||
whitespace = "fix,only-indent-error,trailing-space,space-before-tab";
|
||||
quotepath = false;
|
||||
};
|
||||
diff = {
|
||||
algorithm = "histogram";
|
||||
renames = "copies";
|
||||
};
|
||||
merge = {
|
||||
conflictstyle = "zdiff3";
|
||||
};
|
||||
init = {
|
||||
defaultBranch = "master";
|
||||
};
|
||||
push = {
|
||||
autoSetupRemote = true;
|
||||
default = "current";
|
||||
};
|
||||
pull = {
|
||||
rebase = true;
|
||||
};
|
||||
fetch = {
|
||||
prune = true;
|
||||
};
|
||||
help = {
|
||||
autocorrect = "prompt";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
custom.neovim = {
|
||||
enable = true;
|
||||
hostname = hostname;
|
||||
colorscheme = "unokai";
|
||||
};
|
||||
};
|
||||
}
|
||||
200
home/tmux.nix
Normal file
200
home/tmux.nix
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.custom.tmux;
|
||||
whichKeyConfig = pkgs.writeText "tmux-which-key-config.yaml" (
|
||||
lib.generators.toYAML { } {
|
||||
command_alias_start_index = 200;
|
||||
keybindings = {
|
||||
prefix_table = "Space";
|
||||
};
|
||||
title = {
|
||||
style = "align=centre,bold";
|
||||
prefix = "tmux";
|
||||
prefix_style = "fg=green,align=centre,bold";
|
||||
};
|
||||
custom_variables = { };
|
||||
macros = [ ];
|
||||
position = {
|
||||
x = "R";
|
||||
y = "P";
|
||||
};
|
||||
items = [
|
||||
{
|
||||
name = "Window 1";
|
||||
key = "n";
|
||||
command = "select-window -t 1";
|
||||
}
|
||||
{
|
||||
name = "Window 2";
|
||||
key = "e";
|
||||
command = "select-window -t 2";
|
||||
}
|
||||
{
|
||||
name = "Window 3";
|
||||
key = "i";
|
||||
command = "select-window -t 3";
|
||||
}
|
||||
{
|
||||
name = "Window 4";
|
||||
key = "a";
|
||||
command = "select-window -t 4";
|
||||
}
|
||||
{
|
||||
name = "Next window";
|
||||
key = "Enter";
|
||||
command = "next-window";
|
||||
transient = true;
|
||||
}
|
||||
{
|
||||
name = "Last window";
|
||||
key = "Space";
|
||||
command = "last-window";
|
||||
}
|
||||
{
|
||||
separator = true;
|
||||
}
|
||||
{
|
||||
name = "Copy mode";
|
||||
key = "BSpace";
|
||||
command = "copy-mode";
|
||||
}
|
||||
{
|
||||
separator = true;
|
||||
}
|
||||
{
|
||||
name = "New window";
|
||||
key = "l";
|
||||
command = "new-window";
|
||||
}
|
||||
{
|
||||
name = "New pane (vertical line)";
|
||||
key = ",";
|
||||
command = "splitw -h -c #{pane_current_path}";
|
||||
}
|
||||
{
|
||||
name = "Split (horizontal line)";
|
||||
key = "h";
|
||||
command = "splitw -v -c #{pane_current_path}";
|
||||
}
|
||||
{
|
||||
separator = true;
|
||||
}
|
||||
{
|
||||
name = "Sessions";
|
||||
key = "m";
|
||||
menu = [
|
||||
{
|
||||
name = "sessionizer";
|
||||
key = "Space";
|
||||
command = "run-shell \"tmux neww tmux-sessionizer\"";
|
||||
}
|
||||
{
|
||||
name = "last-session";
|
||||
key = "Enter";
|
||||
command = "run-shell \"tmux switchc -l\"";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
separator = true;
|
||||
}
|
||||
{
|
||||
name = "Kill";
|
||||
key = "k";
|
||||
menu = [
|
||||
{
|
||||
name = "Kill window";
|
||||
key = "w";
|
||||
command = "kill-window";
|
||||
}
|
||||
{
|
||||
name = "Kill pane";
|
||||
key = "p";
|
||||
command = "kill-pane";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
);
|
||||
in
|
||||
{
|
||||
options.custom.tmux = {
|
||||
enable = mkEnableOption "Custom Tmux";
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
baseIndex = 1;
|
||||
keyMode = "vi";
|
||||
mouse = true;
|
||||
|
||||
plugins = with pkgs.tmuxPlugins; [
|
||||
sensible
|
||||
yank
|
||||
pain-control
|
||||
# tmux-powerline
|
||||
{
|
||||
plugin = rose-pine;
|
||||
extraConfig = ''
|
||||
set -g @rose_pine_variant 'main' # Options are 'main', 'moon' or 'dawn'
|
||||
set -g @rose_pine_host 'on'
|
||||
set -g @rose_pine_directory 'on'
|
||||
set -g @rose_pine_bar_bg_disable 'on'
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = pkgs.tmuxPlugins.tmux-which-key.overrideAttrs (old: {
|
||||
postInstall = (old.postInstall or "") + ''
|
||||
echo "[tmux-which-key] Pre-generating configuration at build time..."
|
||||
|
||||
${lib.getExe (pkgs.python3.withPackages (ps: with ps; [ pyyaml ]))} \
|
||||
$target/plugin/build.py \
|
||||
${whichKeyConfig} \
|
||||
$target/init.tmux
|
||||
|
||||
# Append a line to source the pre-generated config
|
||||
echo 'tmux source-file "$root_dir/init.tmux"' >> $target/plugin.sh.tmux
|
||||
'';
|
||||
});
|
||||
extraConfig = ''
|
||||
set -g @tmux-which-key-xdg-enable 1;
|
||||
set -g @tmux-which-key-disable-autobuild 1;
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = resurrect;
|
||||
extraConfig = "set -g @ressurect-strategy-nvim 'session'";
|
||||
}
|
||||
{
|
||||
plugin = continuum;
|
||||
extraConfig = ''
|
||||
set -g @continuum-restore 'on'
|
||||
set -g @continuum-save-interval '60'
|
||||
'';
|
||||
}
|
||||
];
|
||||
extraConfig = ''
|
||||
set -g status-position top
|
||||
set -g focus-events on
|
||||
set -g allow-passthrough on
|
||||
set -s extended-keys on
|
||||
set -g default-terminal "xterm-ghostty"
|
||||
set -as terminal-features ",xterm-ghostty:extkeys"
|
||||
|
||||
bind -n M-, run-shell "tmux neww tmux-sessionizer"
|
||||
bind -n M-/ run-shell "tmux switch-client -t default"
|
||||
bind -n M-. run-shell "tmux switchc -l"
|
||||
|
||||
bind-key -n Home send Escape "OH"
|
||||
bind-key -n End send Escape "OF"
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
855
home/user.nix
Normal file
855
home/user.nix
Normal file
|
|
@ -0,0 +1,855 @@
|
|||
{ hostname, ... }:
|
||||
{
|
||||
home-manager.users.user =
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
{
|
||||
home.username = "user";
|
||||
home.homeDirectory = "/home/user";
|
||||
home.stateVersion = "25.11";
|
||||
home.sessionVariables = {
|
||||
HOME = "/home/user";
|
||||
};
|
||||
|
||||
imports = [
|
||||
./nvim
|
||||
./tmux.nix
|
||||
];
|
||||
|
||||
sops.defaultSopsFile = ../secrets/home.yaml;
|
||||
sops.age.keyFile = "/.persist/${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
||||
sops.secrets."user/ssh/desktop" = {
|
||||
path = "${config.home.homeDirectory}/.ssh/desktop";
|
||||
mode = "0600";
|
||||
};
|
||||
home.file."/.ssh/desktop.pub".text =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILABd/iSJ4gn/ystDqNxLJTG0n0z5VIC9YXlmdUfOhHf desktop@icefox.sh";
|
||||
sops.secrets."user/ssh/legacy_ed25519" = {
|
||||
path = "${config.home.homeDirectory}/.ssh/legacy_ed25519";
|
||||
mode = "0600";
|
||||
};
|
||||
home.file."/.ssh/legacy_ed25519.pub".text =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILkchxtY21PzSLHJ5SoYPrl03+NRzRqznbdCqNyGuOX/ master@michizure.net";
|
||||
|
||||
dconf.settings = {
|
||||
"org/gnome/desktop/interface" = {
|
||||
text-scaling-factor = 1.0;
|
||||
};
|
||||
};
|
||||
# xresources.properties = {
|
||||
# "Xcursor.size" = 14;
|
||||
# # "Xft.dpi" = 144;
|
||||
# "Xft.autohint" = 0;
|
||||
# "Xft.lcdfilter" = "lcddefault";
|
||||
# "Xft.hintstyle" = "hintfull";
|
||||
# "Xft.hinting" = 1;
|
||||
# "Xft.antialias" = 1;
|
||||
# "Xft.rgba" = "rgb";
|
||||
# };
|
||||
|
||||
# systemd.user.services.xrdb-configure = {
|
||||
# Unit = {
|
||||
# Description = "Load Xresources";
|
||||
# };
|
||||
# Intall = {
|
||||
# WantedBy = [ "graphical-session.target" ];
|
||||
# };
|
||||
# Service = {
|
||||
# ExecStart = "${pkgs.xrdb}/bin/xrdb -merge ${config.home.homeDirectory}/.Xresources";
|
||||
# Type = "oneshot";
|
||||
# };
|
||||
# };
|
||||
sops.secrets."user/gpg/legacy_fnzr" = { };
|
||||
home.activation.importGpgKey = config.lib.dag.entryAfter [ "writeBoundary" ] ''
|
||||
if [[ -f "${config.sops.secrets."user/gpg/legacy_fnzr".path}" ]]; then
|
||||
${pkgs.gnupg}/bin/gpg --batch --import "${
|
||||
config.sops.secrets."user/gpg/legacy_fnzr".path
|
||||
}" || true
|
||||
echo "YOUR_KEY_FINGERPRINT:6:" | ${pkgs.gnupg}/bin/gpg --import-ownertrust || true
|
||||
fi
|
||||
'';
|
||||
|
||||
xdg.configFile."mimeapps.list".force = true;
|
||||
|
||||
xdg.configFile."containers/containers.conf".text = ''
|
||||
[engine]
|
||||
compose_warning_logs=false
|
||||
events_logger="file"
|
||||
|
||||
[containers]
|
||||
log_driver="k8s-file"
|
||||
'';
|
||||
|
||||
xdg.configFile."lazygit/config.yml".text = lib.generators.toYAML { } {
|
||||
gui = {
|
||||
theme = {
|
||||
selectedLineBgColor = [ "reverse" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# xdg.configFile."opencode/opencode.json".text = builtins.toJSON {
|
||||
# "$schema" = "https://opencode.ai/config.json";
|
||||
# plugin = [ "opencode-antigravity-auth@latest" ];
|
||||
# provider = {
|
||||
# google = {
|
||||
# models = {
|
||||
# antigravity-gemini-3-pro = {
|
||||
# name = "Gemini 3 Pro (Antigravity)";
|
||||
# limit = {
|
||||
# context = 1048576;
|
||||
# output = 65535;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# variants = {
|
||||
# low = {
|
||||
# thinkingLevel = "low";
|
||||
# };
|
||||
# high = {
|
||||
# thinkingLevel = "high";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# antigravity-gemini-3-flash = {
|
||||
# name = "Gemini 3 Flash (Antigravity)";
|
||||
# limit = {
|
||||
# context = 1048576;
|
||||
# output = 65536;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# variants = {
|
||||
# minimal = {
|
||||
# thinkingLevel = "minimal";
|
||||
# };
|
||||
# low = {
|
||||
# thinkingLevel = "low";
|
||||
# };
|
||||
# medium = {
|
||||
# thinkingLevel = "medium";
|
||||
# };
|
||||
# high = {
|
||||
# thinkingLevel = "high";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# antigravity-claude-sonnet-4-5 = {
|
||||
# name = "Claude Sonnet 4.5 (Antigravity)";
|
||||
# limit = {
|
||||
# context = 200000;
|
||||
# output = 64000;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# };
|
||||
# antigravity-claude-sonnet-4-5-thinking = {
|
||||
# name = "Claude Sonnet 4.5 Thinking (Antigravity)";
|
||||
# limit = {
|
||||
# context = 200000;
|
||||
# output = 64000;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# variants = {
|
||||
# low = {
|
||||
# thinkingConfig = {
|
||||
# thinkingBudget = 8192;
|
||||
# };
|
||||
# };
|
||||
# max = {
|
||||
# thinkingConfig = {
|
||||
# thinkingBudget = 32768;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# antigravity-claude-opus-4-5-thinking = {
|
||||
# name = "Claude Opus 4.5 Thinking (Antigravity)";
|
||||
# limit = {
|
||||
# context = 200000;
|
||||
# output = 64000;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# variants = {
|
||||
# low = {
|
||||
# thinkingConfig = {
|
||||
# thinkingBudget = 8192;
|
||||
# };
|
||||
# };
|
||||
# max = {
|
||||
# thinkingConfig = {
|
||||
# thinkingBudget = 32768;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# antigravity-claude-opus-4-6-thinking = {
|
||||
# name = "Claude Opus 4.6 Thinking (Antigravity)";
|
||||
# limit = {
|
||||
# context = 200000;
|
||||
# output = 64000;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# variants = {
|
||||
# low = {
|
||||
# thinkingConfig = {
|
||||
# thinkingBudget = 8192;
|
||||
# };
|
||||
# };
|
||||
# max = {
|
||||
# thinkingConfig = {
|
||||
# thinkingBudget = 32768;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# "gemini-2.5-flash" = {
|
||||
# name = "Gemini 2.5 Flash (Gemini CLI)";
|
||||
# limit = {
|
||||
# context = 1048576;
|
||||
# output = 65536;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# };
|
||||
# "gemini-2.5-pro" = {
|
||||
# name = "Gemini 2.5 Pro (Gemini CLI)";
|
||||
# limit = {
|
||||
# context = 1048576;
|
||||
# output = 65536;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# };
|
||||
# gemini-3-flash-preview = {
|
||||
# name = "Gemini 3 Flash Preview (Gemini CLI)";
|
||||
# limit = {
|
||||
# context = 1048576;
|
||||
# output = 65536;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# };
|
||||
# gemini-3-pro-preview = {
|
||||
# name = "Gemini 3 Pro Preview (Gemini CLI)";
|
||||
# limit = {
|
||||
# context = 1048576;
|
||||
# output = 65535;
|
||||
# };
|
||||
# modalities = {
|
||||
# input = [
|
||||
# "text"
|
||||
# "image"
|
||||
# "pdf"
|
||||
# ];
|
||||
# output = [ "text" ];
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
|
||||
xdg.desktopEntries = {
|
||||
google-chrome = {
|
||||
name = "Google Chrome";
|
||||
genericName = "Web Browser";
|
||||
exec = "/run/current-system/sw/bin/google-chrome-stable";
|
||||
terminal = false;
|
||||
icon = "google-chrome";
|
||||
type = "Application";
|
||||
categories = [
|
||||
"Network"
|
||||
"WebBrowser"
|
||||
];
|
||||
};
|
||||
chromium-browser = {
|
||||
name = "Chromium";
|
||||
genericName = "Web Browser";
|
||||
exec = "/run/current-system/sw/bin/chromium";
|
||||
terminal = false;
|
||||
icon = "chromium";
|
||||
type = "Application";
|
||||
categories = [
|
||||
"Network"
|
||||
"WebBrowser"
|
||||
];
|
||||
};
|
||||
chromium-browser-sandbox = {
|
||||
name = "Chromium (Sandbox)";
|
||||
genericName = "Web Browser";
|
||||
exec = "/run/current-system/sw/bin/chromium-sandbox --data-dir=/data/sandbox/chromium/data-dir";
|
||||
terminal = false;
|
||||
icon = "chromium";
|
||||
type = "Application";
|
||||
categories = [
|
||||
"Network"
|
||||
"WebBrowser"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
xdg.mimeApps = {
|
||||
enable = true;
|
||||
defaultApplications = {
|
||||
# text
|
||||
"text/plain" = "nvim.desktop";
|
||||
"text/markdown" = "nvim.desktop";
|
||||
"text/x-python" = "nvim.desktop";
|
||||
"text/x-shellscript" = "nvim.desktop";
|
||||
"text/x-csrc" = "nvim.desktop";
|
||||
"text/x-c++src" = "nvim.desktop";
|
||||
"text/x-java" = "nvim.desktop";
|
||||
"text/x-makefile" = "nvim.desktop";
|
||||
"application/json" = "nvim.desktop";
|
||||
"application/javascript" = "nvim.desktop";
|
||||
"application/x-yaml" = "nvim.desktop";
|
||||
"application/xml" = "nvim.desktop";
|
||||
"text/*" = "nvim.desktop";
|
||||
|
||||
# browser
|
||||
"text/html" = "firefox.desktop";
|
||||
"x-scheme-handler/http" = "firefox.desktop";
|
||||
"x-scheme-handler/https" = "firefox.desktop";
|
||||
"x-scheme-handler/about" = "firefox.desktop";
|
||||
"x-scheme-handler/unknown" = "firefox.desktop";
|
||||
|
||||
# swayimg
|
||||
"image/jpeg" = "swayimg.desktop";
|
||||
"image/jpg" = "swayimg.desktop";
|
||||
"image/png" = "swayimg.desktop";
|
||||
"image/gif" = "swayimg.desktop";
|
||||
"image/webp" = "swayimg.desktop";
|
||||
"image/bmp" = "swayimg.desktop";
|
||||
"image/tiff" = "swayimg.desktop";
|
||||
"image/svg+xml" = "swayimg.desktop";
|
||||
"image/x-icon" = "swayimg.desktop";
|
||||
"image/*" = "swayimg.desktop";
|
||||
|
||||
# pdf & readers
|
||||
"application/pdf" = "org.pwmt.zathura.desktop";
|
||||
"application/postscript" = "org.pwmt.zathura.desktop";
|
||||
"image/vnd.djvu" = "org.pwmt.zathura.desktop";
|
||||
"application/x-cbr" = "org.pwmt.zathura.desktop";
|
||||
"application/x-cbz" = "org.pwmt.zathura.desktop";
|
||||
"application/x-cb7" = "org.pwmt.zathura.desktop";
|
||||
"application/x-cbt" = "org.pwmt.zathura.desktop";
|
||||
"application/epub+zip" = "org.pwmt.zathura.desktop";
|
||||
|
||||
# video
|
||||
"video/mp4" = "mpv.desktop";
|
||||
"video/x-matroska" = "mpv.desktop";
|
||||
"video/webm" = "mpv.desktop";
|
||||
"video/mpeg" = "mpv.desktop";
|
||||
"video/x-msvideo" = "mpv.desktop";
|
||||
"video/quicktime" = "mpv.desktop";
|
||||
"video/x-flv" = "mpv.desktop";
|
||||
"video/3gpp" = "mpv.desktop";
|
||||
"video/ogg" = "mpv.desktop";
|
||||
"video/*" = "mpv.desktop";
|
||||
|
||||
# audio
|
||||
"audio/mpeg" = "mpv.desktop";
|
||||
"audio/mp4" = "mpv.desktop";
|
||||
"audio/x-wav" = "mpv.desktop";
|
||||
"audio/flac" = "mpv.desktop";
|
||||
"audio/ogg" = "mpv.desktop";
|
||||
"audio/x-vorbis+ogg" = "mpv.desktop";
|
||||
"audio/x-opus+ogg" = "mpv.desktop";
|
||||
"audio/aac" = "mpv.desktop";
|
||||
"audio/x-m4a" = "mpv.desktop";
|
||||
"audio/webm" = "mpv.desktop";
|
||||
"audio/*" = "mpv.desktop";
|
||||
};
|
||||
};
|
||||
|
||||
xdg.userDirs = {
|
||||
enable = true;
|
||||
createDirectories = true;
|
||||
|
||||
download = "${config.home.homeDirectory}/downloads";
|
||||
documents = "${config.home.homeDirectory}/documents";
|
||||
desktop = "${config.home.homeDirectory}/desktop";
|
||||
pictures = "${config.home.homeDirectory}/pictures";
|
||||
music = "${config.home.homeDirectory}/music";
|
||||
videos = "${config.home.homeDirectory}/videos";
|
||||
templates = "${config.home.homeDirectory}";
|
||||
publicShare = "${config.home.homeDirectory}";
|
||||
|
||||
extraConfig = {
|
||||
SCREENSHOTS = "${config.home.homeDirectory}/pictures/screenshots";
|
||||
XDG_CACHE_HOME = "${config.home.homeDirectory}/.cache";
|
||||
};
|
||||
};
|
||||
|
||||
programs = {
|
||||
dank-material-shell.enable = true;
|
||||
ssh = {
|
||||
enable = true;
|
||||
enableDefaultConfig = false;
|
||||
matchBlocks = {
|
||||
"*" = {
|
||||
serverAliveInterval = 60;
|
||||
serverAliveCountMax = 3;
|
||||
};
|
||||
"github.com" = {
|
||||
identityFile = config.sops.secrets."user/ssh/legacy_ed25519".path;
|
||||
};
|
||||
"icefox.sh" = {
|
||||
user = "git";
|
||||
identityFile = config.sops.secrets."user/ssh/desktop".path;
|
||||
};
|
||||
};
|
||||
};
|
||||
delta = {
|
||||
enable = true;
|
||||
options = {
|
||||
navigate = true;
|
||||
line-numbers = true;
|
||||
side-by-side = true;
|
||||
};
|
||||
enableGitIntegration = true;
|
||||
};
|
||||
git = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
signing = {
|
||||
key = "${config.home.homeDirectory}/.ssh/desktop.pub";
|
||||
signByDefault = true;
|
||||
};
|
||||
includes = [
|
||||
{
|
||||
condition = "gitdir:~/work/";
|
||||
contents = {
|
||||
user = {
|
||||
name = "felipematos";
|
||||
email = "5471818+fnzr@users.noreply.github.com";
|
||||
};
|
||||
};
|
||||
}
|
||||
];
|
||||
settings = {
|
||||
user = {
|
||||
email = "felipe@icefox.sh";
|
||||
name = "icefox";
|
||||
signingkey = "${config.home.homeDirectory}/.ssh/desktop.pub";
|
||||
};
|
||||
gpg.format = "ssh";
|
||||
commit.gpgsign = true;
|
||||
tag.gpgsign = true;
|
||||
core = {
|
||||
editor = "nvim";
|
||||
whitespace = "fix,only-indent-error,trailing-space,space-before-tab";
|
||||
quotepath = false;
|
||||
};
|
||||
diff = {
|
||||
algorithm = "histogram";
|
||||
renames = "copies";
|
||||
tool = "nvim";
|
||||
};
|
||||
difftool = {
|
||||
prompt = false;
|
||||
nvim.cmd = "nvim -d $LOCAL $REMOTE";
|
||||
};
|
||||
merge = {
|
||||
conflictstyle = "zdiff3";
|
||||
tool = "nvim";
|
||||
};
|
||||
mergetool = {
|
||||
prompt = false;
|
||||
keepBackup = false;
|
||||
nvim.cmd = "nvim -d $LOCAL $REMOTE $MERGED -c 'wincmd w' -c 'wincmd J'";
|
||||
};
|
||||
init = {
|
||||
defaultBranch = "master";
|
||||
};
|
||||
push = {
|
||||
autoSetupRemote = true;
|
||||
default = "current";
|
||||
};
|
||||
pull = {
|
||||
rebase = true;
|
||||
};
|
||||
fetch = {
|
||||
prune = true;
|
||||
};
|
||||
help = {
|
||||
autocorrect = "prompt";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
xrdb
|
||||
(writeShellApplication {
|
||||
name = "tmux-sessionizer";
|
||||
runtimeInputs = [
|
||||
tmux
|
||||
fzf
|
||||
];
|
||||
text = builtins.readFile ./bin/tmux-sessionizer;
|
||||
})
|
||||
(writeShellScriptBin "opencode" ''
|
||||
ssh -t user@192.168.77.2 "
|
||||
cd $(pwd) 2>/dev/null || cd \$(mktemp -d)
|
||||
opencode $*
|
||||
"
|
||||
'')
|
||||
(writeShellScriptBin "claude" ''
|
||||
ssh -t user@192.168.77.2 "
|
||||
cd $(pwd) 2>/dev/null || cd \$(mktemp -d)
|
||||
claude $*
|
||||
"
|
||||
'')
|
||||
];
|
||||
|
||||
custom.tmux.enable = true;
|
||||
custom.neovim = {
|
||||
enable = true;
|
||||
colorscheme = "rose-pine-moon";
|
||||
hostname = hostname;
|
||||
};
|
||||
|
||||
programs.fish = {
|
||||
enable = true;
|
||||
plugins = [
|
||||
{
|
||||
name = "puffer";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "nickeb96";
|
||||
repo = "puffer-fish";
|
||||
rev = "83174b0";
|
||||
sha256 = "sha256-Dhx5+XRxJvlhdnFyimNxFyFiASrGU4ZwyefsDwtKnSg=";
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
interactiveShellInit = ''
|
||||
set fish_greeting
|
||||
bind ctrl-space ""
|
||||
'';
|
||||
};
|
||||
|
||||
programs.starship = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
programs.zoxide = {
|
||||
enable = true;
|
||||
enableFishIntegration = true;
|
||||
};
|
||||
|
||||
programs.ghostty = {
|
||||
enable = true;
|
||||
settings = {
|
||||
theme = "Rose Pine Moon";
|
||||
font-family = [
|
||||
"MonaspiceNe Nerd Font Mono"
|
||||
"Fire Code Symbol"
|
||||
];
|
||||
font-size = "10";
|
||||
font-feature = "+calt, +liga, +dlig, +ss01, +ss02, +ss03, +ss04, +ss05, +ss06, +ss07, +ss08, +ss09, +ss10";
|
||||
keybind = [
|
||||
"shift+escape=unbind"
|
||||
# "ctrl+c=copy_to_clipboard"
|
||||
"ctrl+v=paste_from_clipboard"
|
||||
];
|
||||
};
|
||||
enableFishIntegration = true;
|
||||
systemd.enable = true;
|
||||
};
|
||||
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
package = pkgs.firefox;
|
||||
nativeMessagingHosts = [
|
||||
pkgs.browserpass
|
||||
pkgs.tridactyl-native
|
||||
];
|
||||
profiles.default = {
|
||||
id = 0;
|
||||
name = "default";
|
||||
isDefault = true;
|
||||
containersForce = true;
|
||||
userChrome = ''
|
||||
#TabsToolbar {
|
||||
visibility: collapse;
|
||||
}
|
||||
'';
|
||||
settings = {
|
||||
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
||||
};
|
||||
# settings = {
|
||||
# "tabopencontaineraware" = true;
|
||||
# };
|
||||
containers = {
|
||||
personal = {
|
||||
id = 1;
|
||||
color = "blue";
|
||||
icon = "fingerprint";
|
||||
};
|
||||
google = {
|
||||
id = 2;
|
||||
color = "pink";
|
||||
icon = "fence";
|
||||
};
|
||||
london = {
|
||||
id = 3;
|
||||
color = "orange";
|
||||
icon = "tree";
|
||||
};
|
||||
research = {
|
||||
id = 4;
|
||||
color = "green";
|
||||
icon = "tree";
|
||||
};
|
||||
chill = {
|
||||
id = 5;
|
||||
color = "turquoise";
|
||||
icon = "chill";
|
||||
};
|
||||
work = {
|
||||
id = 6;
|
||||
color = "red";
|
||||
icon = "briefcase";
|
||||
};
|
||||
};
|
||||
|
||||
search = {
|
||||
force = true;
|
||||
default = "ddg";
|
||||
order = [
|
||||
"ddg"
|
||||
"Kagi"
|
||||
"MyNixOS"
|
||||
"PHP"
|
||||
];
|
||||
engines = {
|
||||
"PHP" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://www.php.net/search.php";
|
||||
params = [
|
||||
{
|
||||
name = "pattern";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
definedAliases = [ "php" ];
|
||||
};
|
||||
"MyNixOS" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://mynixos.com/search";
|
||||
params = [
|
||||
{
|
||||
name = "q";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
definedAliases = [ "nix" ];
|
||||
};
|
||||
"Kagi" = {
|
||||
urls = [ { template = "https://kagi.com/search?q={searchTerms}"; } ];
|
||||
icon = "https://kagi.com/favicon.ico";
|
||||
updateInterval = 24 * 60 * 60 * 1000;
|
||||
definedAliases = [ "kg" ];
|
||||
};
|
||||
"ddg" = {
|
||||
metaData.alias = "dd";
|
||||
};
|
||||
"google".metaData.hidden = true;
|
||||
"bing".metaData.hidden = true;
|
||||
"amazondotcom-us".metaData.hidden = true;
|
||||
"ebay".metaData.hidden = true;
|
||||
};
|
||||
};
|
||||
|
||||
# settings = {
|
||||
# "layout.css.prefers-color-scheme.content-override" = 2;
|
||||
# "privacy.resistFingerprinting" = true;
|
||||
# "privacy.resistFingerprinting.exemptions" = "prefers-color-scheme";
|
||||
# "browser.theme.dark-private-windows" = true;
|
||||
# };
|
||||
extensions = {
|
||||
packages = with pkgs.nur.repos.rycee.firefox-addons; [
|
||||
ublock-origin
|
||||
tridactyl
|
||||
gopass-bridge
|
||||
multi-account-containers
|
||||
foxyproxy-standard
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
programs.librewolf = {
|
||||
enable = true;
|
||||
package = pkgs.librewolf;
|
||||
|
||||
nativeMessagingHosts = [
|
||||
pkgs.browserpass
|
||||
pkgs.tridactyl-native
|
||||
];
|
||||
profiles.default = {
|
||||
id = 0;
|
||||
name = "default";
|
||||
isDefault = true;
|
||||
containersForce = true;
|
||||
settings = {
|
||||
"tabopencontaineraware" = true;
|
||||
};
|
||||
containers = {
|
||||
personal = {
|
||||
id = 1;
|
||||
color = "blue";
|
||||
icon = "fingerprint";
|
||||
};
|
||||
google = {
|
||||
id = 2;
|
||||
color = "pink";
|
||||
icon = "fence";
|
||||
};
|
||||
london = {
|
||||
id = 3;
|
||||
color = "orange";
|
||||
icon = "briefcase";
|
||||
};
|
||||
research = {
|
||||
id = 4;
|
||||
color = "green";
|
||||
icon = "tree";
|
||||
};
|
||||
chill = {
|
||||
id = 5;
|
||||
color = "turquoise";
|
||||
icon = "chill";
|
||||
};
|
||||
};
|
||||
|
||||
search = {
|
||||
force = true;
|
||||
default = "ddg";
|
||||
order = [
|
||||
"ddg"
|
||||
"Kagi"
|
||||
"NixOS"
|
||||
];
|
||||
engines = {
|
||||
"Kagi" = {
|
||||
urls = [ { template = "https://kagi.com/search?q={searchTerms}"; } ];
|
||||
icon = "https://kagi.com/favicon.ico";
|
||||
updateInterval = 24 * 60 * 60 * 1000;
|
||||
definedAliases = [ "kg" ];
|
||||
};
|
||||
"nx" = {
|
||||
urls = [ { template = "https://mynixos.com/search?q={searchTerms}"; } ];
|
||||
icon = "https://mynixos.com/favicon.ico";
|
||||
updateInterval = 24 * 60 * 60 * 1000;
|
||||
definedAliases = [ "nx" ];
|
||||
};
|
||||
"ddg" = {
|
||||
metaData.alias = "dd";
|
||||
};
|
||||
"google".metaData.hidden = true;
|
||||
"bing".metaData.hidden = true;
|
||||
"amazondotcom-us".metaData.hidden = true;
|
||||
"ebay".metaData.hidden = true;
|
||||
};
|
||||
};
|
||||
|
||||
settings = {
|
||||
"layout.css.prefers-color-scheme.content-override" = 2;
|
||||
"privacy.resistFingerprinting" = false;
|
||||
"privacy.resistFingerprinting.exemptions" = "prefers-color-scheme";
|
||||
"browser.theme.dark-private-windows" = true;
|
||||
};
|
||||
extensions = {
|
||||
packages = with pkgs.nur.repos.rycee.firefox-addons; [
|
||||
ublock-origin
|
||||
tridactyl
|
||||
gopass-bridge
|
||||
multi-account-containers
|
||||
foxyproxy-standard
|
||||
];
|
||||
# force = true;
|
||||
# settings."uBlock0@raymondhill.net".settings = {
|
||||
# selectedFilterLists = [
|
||||
# "ublock-filters"
|
||||
# "ublock-badware"
|
||||
# "ublock-privacy"
|
||||
# "ublock-unbreak"
|
||||
# "ublock-quick-fixes"
|
||||
# ];
|
||||
# };
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue