initial commit
This commit is contained in:
commit
120dbdbc64
21 changed files with 2413 additions and 0 deletions
180
home/nvim/default.nix
Normal file
180
home/nvim/default.nix
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
{
|
||||
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 = blink-cmp;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("blink.cmp").setup({
|
||||
keymap = {
|
||||
preset = "default",
|
||||
["<C-y>"] = { "select_and_accept", "snippet_forward", "fallback" },
|
||||
["<C-S-y>"] = { "snippet_backward", "fallback" },
|
||||
},
|
||||
})
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = conform-nvim;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("conform").setup({
|
||||
formatters_by_ft = {
|
||||
lua = { "stylua" },
|
||||
javascript = { "prettierd" },
|
||||
nix = { "nixfmt" },
|
||||
python = { "black" },
|
||||
php = { "php_cs_fixer" },
|
||||
zig = { "zigfmt" },
|
||||
css = { "prettierd" },
|
||||
scss = { "prettierd" },
|
||||
less = { "prettierd" },
|
||||
blade = { "blade-formatter" },
|
||||
go = { "go fmt" },
|
||||
},
|
||||
})
|
||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||
pattern = "*",
|
||||
callback = function(args)
|
||||
require("conform").format({ bufnr = args.buf })
|
||||
end,
|
||||
})
|
||||
vim.keymap.set("n", "<leader>c", function()
|
||||
require("conform").format({
|
||||
lsp_fallback = true,
|
||||
async = true,
|
||||
timeout_ms = 500,
|
||||
})
|
||||
end, { desc = "conform format" })
|
||||
'';
|
||||
}
|
||||
# (codecompanion-nvim.overrideAttrs (_: {
|
||||
# src = pkgs.fetchFromGitHub {
|
||||
# owner = "olimorris";
|
||||
# repo = "codecompanion.nvim";
|
||||
# tag = "v18.2.1";
|
||||
# sha256 = "sha256-94uX1Ie+BiKSPGCYcUwoZ6DZwSz8tUxaNsa+xTv1ejw=";
|
||||
# };
|
||||
# }))
|
||||
kanagawa-nvim
|
||||
leap-nvim
|
||||
{
|
||||
plugin = mini-icons;
|
||||
type = "lua";
|
||||
config = ''require("mini.icons").setup()'';
|
||||
}
|
||||
{
|
||||
plugin = nvim-treesitter.withAllGrammars;
|
||||
type = "lua";
|
||||
config = ''
|
||||
require("nvim-treesitter").setup({
|
||||
highlight = {
|
||||
enable = true,
|
||||
additional_vim_regex_highlighting = false,
|
||||
},
|
||||
indent = { enable = true },
|
||||
refactor = {
|
||||
highlight_definitions = { enable = true },
|
||||
},
|
||||
})
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = nvim-treesitter-context;
|
||||
type = "lua";
|
||||
config = ''require("treesitter-context").setup()'';
|
||||
}
|
||||
{
|
||||
plugin = nvim-treesitter-textobjects;
|
||||
# type = "lua";
|
||||
# config = ''
|
||||
# vim.g.no_plugin_maps = true
|
||||
# require("treesitter-textobjects").setup()
|
||||
# '';
|
||||
}
|
||||
nvim-lspconfig
|
||||
{
|
||||
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" })
|
||||
'';
|
||||
}
|
||||
phpactor
|
||||
{
|
||||
plugin = render-markdown-nvim;
|
||||
type = "lua";
|
||||
config = ''require("render-markdown").setup()'';
|
||||
}
|
||||
snacks-nvim
|
||||
tokyonight-nvim
|
||||
{
|
||||
plugin = undotree;
|
||||
type = "lua";
|
||||
config = ''vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle, { desc = "undotree" })'';
|
||||
}
|
||||
{
|
||||
plugin = vimtex;
|
||||
type = "lua";
|
||||
config = ''
|
||||
vim.g.vimtex_view_method = "zathura"
|
||||
vim.g.vimtex_compiler_method = "latexmk"
|
||||
'';
|
||||
}
|
||||
{
|
||||
plugin = which-key-nvim;
|
||||
type = "lua";
|
||||
config = ''require("which-key").setup()'';
|
||||
}
|
||||
];
|
||||
extraConfig = ''
|
||||
colorscheme ${cfg.colorscheme}
|
||||
'';
|
||||
extraLuaConfig = ''
|
||||
${builtins.readFile ./settings.lua}
|
||||
${builtins.replaceStrings [ "@HOSTNAME@" ] [ cfg.hostname ] (builtins.readFile ./plugins.lua)}
|
||||
require("custom")
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
148
home/nvim/plugins.lua
Normal file
148
home/nvim/plugins.lua
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
local hostname = "@HOSTNAME@"
|
||||
|
||||
local servers = {
|
||||
textlab = {},
|
||||
lua_ls = {},
|
||||
rust_analyzer = {},
|
||||
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 = {},
|
||||
}
|
||||
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", "gD", vim.lsp.buf.declaration, { buffer = ev.buf, desc = "go to declaration" })
|
||||
vim.keymap.set("n", "gd", vim.lsp.buf.definition, { buffer = ev.buf, desc = "go to definition" })
|
||||
-- vim.keymap.set("n", "gi", vim.lsp.buf.implementaion, { buffer = ev.buf, desc = "go to implementation" })
|
||||
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, { buffer = ev.buf, desc = "lsp rename" })
|
||||
vim.keymap.set("n", "<leader>a", vim.lsp.buf.code_action, { buffer = ev.buf, desc = "code action" })
|
||||
vim.keymap.set({ "n", "i" }, "<C-k>", vim.lsp.buf.signature_help, { buffer = ev.buf, desc = "signature help" })
|
||||
vim.keymap.set("n", "gr", vim.lsp.buf.references, { buffer = ev.buf, desc = "references" })
|
||||
end,
|
||||
})
|
||||
|
||||
local snacks = require("snacks")
|
||||
snacks.setup({
|
||||
bigfile = {},
|
||||
dim = {},
|
||||
image = {},
|
||||
indent = {},
|
||||
lazygit = {},
|
||||
picker = {},
|
||||
quickfile = {},
|
||||
notifier = {},
|
||||
})
|
||||
vim.keymap.set("n", "<leader>tf", function()
|
||||
snacks.picker.grep()
|
||||
end, { desc = "grep picker" })
|
||||
vim.keymap.set("n", "<leader>te", snacks.picker.files, { desc = "file picker" })
|
||||
vim.keymap.set("n", "<leader>lg", function()
|
||||
snacks.lazygit()
|
||||
end, { desc = "lazygit" })
|
||||
|
||||
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" })
|
||||
151
home/nvim/settings.lua
Normal file
151
home/nvim/settings.lua
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
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.o.exrc = true
|
||||
|
||||
vim.cmd("set title")
|
||||
vim.cmd("set ic")
|
||||
|
||||
-- Delete without yanking
|
||||
vim.keymap.set({ "n", "v" }, "<leader>d", '"_d', { desc = "Delete without yanking" })
|
||||
vim.keymap.set({ "n", "v" }, "<C-c>", '"+y', { desc = "Copy to clipboard" })
|
||||
|
||||
-- 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-h>", "<C-w>h", { desc = "Move to left window" })
|
||||
vim.keymap.set("n", "<C-l>", "<C-w>l", { desc = "Move to right window" })
|
||||
vim.keymap.set("n", "<C-k>", "<C-w>k", { desc = "Move to top window" })
|
||||
vim.keymap.set("n", "<C-j>", "<C-w>j", { desc = "Move to bottom window" })
|
||||
|
||||
--- indenting in visual mode
|
||||
-- vim.keymap.set("v", "<", "<gv", { desc = "Indent left and reselect" })
|
||||
-- vim.keymap.set("v", ">", ">gv", { desc = "Indent right and reselect" })
|
||||
|
||||
local augroup = vim.api.nvim_create_augroup("UserConfig", {})
|
||||
|
||||
-- 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,
|
||||
})
|
||||
|
||||
--- close terminal when process exits
|
||||
vim.api.nvim_create_autocmd("TermClose", {
|
||||
group = augroup,
|
||||
callback = function()
|
||||
if vim.v.event.status == 0 then
|
||||
vim.api.nvim_buf_delete(0, {})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Disable syntax highlighting for large files
|
||||
vim.api.nvim_create_autocmd("BufReadPre", {
|
||||
pattern = "*",
|
||||
callback = function()
|
||||
local size = vim.fn.getfsize(vim.fn.expand("<afile>"))
|
||||
if size > 1024 * 1024 then -- 1MB threshold
|
||||
vim.cmd("syntax off")
|
||||
vim.opt_local.wrap = false
|
||||
vim.opt_local.number = false
|
||||
vim.opt_local.relativenumber = false
|
||||
end
|
||||
end,
|
||||
})
|
||||
--- create directory when saving files
|
||||
-- vim.api.nvim_create_autocmd("BufWritePre", {
|
||||
-- group = augroup,
|
||||
-- callback = function()
|
||||
-- local dir = vim.fn.expand("<afile>:p:h")
|
||||
-- if vim.fn.isdirectory(dir) == 0 and dir ~= "oil:" then
|
||||
-- vim.fn.mkdir(dir, "p")
|
||||
-- end
|
||||
-- end,
|
||||
-- })
|
||||
|
||||
--- command line completion
|
||||
vim.opt.wildmenu = true
|
||||
vim.opt.wildmode = "longest:full,full"
|
||||
vim.opt.wildignore:append({ "*.o", "*.obj", "*.pyc", "*.class", "*.jar" })
|
||||
Loading…
Add table
Add a link
Reference in a new issue