refactor(nvim): move config out of module

This commit is contained in:
2026-09-28 21:18:11 +02:00
parent 178a51d75e
commit aee9682d64
82 changed files with 3 additions and 3 deletions
+6
View File
@@ -0,0 +1,6 @@
# Neovim configuration
My neovim configuration. Available as a Nix flake [^nixcats]. When installing manually,
`paq.nvim` is used as a fallback plugin manager.
[^nixcats]: Based on [this nixCats `example` template](https://github.com/BirdeeHub/nixCats-nvim/tree/77dffad8235eb77684fcb7599487c8e9f23d5b8f/templates/example)
@@ -0,0 +1,37 @@
vim.cmd([[
function GetClozeNumber()
let REGEX_CLOZE_START = '{{c\d\+::'
" Find previous cloze match
let prev_match = searchpos(REGEX_CLOZE_START, 'bW', line("gg"))
" Only get number if cloze was matched (i.e. when cursor does not end up at
" start of file)
if max(prev_match) != 0
" Get word under cursor (ignoring curly braces and `::`),
" get the second character of the word and cast it to an int
" add one for the next cloze number
return str2nr(expand("<cword>")[1]) + 1
else
return 1
endif
endfunction
" Wrap the next cloze number
function GetClozeStart()
return "{{c" . GetClozeNumber() . "::"
endfunction
function GetClozeEnd()
return "}}"
endfunction
let g:sandwich#recipes += [
\ {
\ 'buns': ['GetClozeStart()', 'GetClozeEnd()'],
\ 'expr' : 1,
\ 'filetype': ['pandoc'],
\ 'input': ['c'],
\ 'nesting': 1
\ }
\ ]
]])
@@ -0,0 +1,3 @@
require("auto-session").setup({
auto_session_enabled = vim.env.KITTY_SCROLLBACK_NVIM ~= "true", -- See kitty-scrollback.nvim
})
@@ -0,0 +1,26 @@
require("claudecode").setup({
-- terminal = {
-- provider = "snacks",
-- snacks_win_opts = {
-- position = "float",
-- width = 0.8,
-- height = 0.8,
-- border = "rounded",
-- },
-- },
-- diff_opts = {
-- layout = "vertical",
-- },
})
local map = vim.keymap.set
map({ "n", "t" }, "<C-_>", "<cmd>ClaudeCode<cr>", { desc = "Toggle Claude Code" })
map("n", "<leader>cf", "<cmd>ClaudeCodeFocus<cr>", { desc = "Focus Claude Code" })
map("n", "<leader>cC", "<cmd>ClaudeCode --continue<cr>", { desc = "Claude Code (continue)" })
map("n", "<leader>cr", "<cmd>ClaudeCode --resume<cr>", { desc = "Claude Code (resume)" })
map("n", "<leader>cm", "<cmd>ClaudeCodeSelectModel<cr>", { desc = "Claude Code select model" })
map("n", "<leader>cb", "<cmd>ClaudeCodeAdd %<cr>", { desc = "Add buffer to Claude Code" })
map("v", "<leader>cs", "<cmd>ClaudeCodeSend<cr>", { desc = "Send selection to Claude Code" })
map("n", "<leader>co", "<cmd>ClaudeCodeDiffAccept<cr>", { desc = "Accept Claude Code diff" })
map("n", "<leader>cd", "<cmd>ClaudeCodeDiffDeny<cr>", { desc = "Deny Claude Code diff" })
@@ -0,0 +1,7 @@
require("codecompanion").setup({
ignore_warnings = true,
strategies = {
chat = { adapter = "openai" },
inline = { adapter = "openai" },
},
})
@@ -0,0 +1,30 @@
require("conform").setup({
format_after_save = {
lsp_fallback = false,
async = false,
timeout_ms = 500,
},
formatters_by_ft = {
awk = { "awk" },
bash = { "shellcheck" },
c = { "clang-format" },
cpp = { "clang-format" },
css = { "prettierd", "prettier", stop_after_first = true },
gdscript = { "gdformat" },
haskell = { "ormolu" },
html = { "prettierd", "prettier", stop_after_first = true },
javascript = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
javascriptreact = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
json = { "prettierd", "prettier", stop_after_first = true },
jsonc = { "prettierd", "prettier", stop_after_first = true },
lua = { "stylua" }, -- configured in stylua.toml
markdown = { "prettierd", "prettier", stop_after_first = true },
nix = { "nixfmt" },
python = { "isort", "black" },
rust = { "rustfmt", lsp_fallback = "fallback" },
svelte = { "eslint_d", "prettierd", "prettier", stop_after_first = true },
typescript = { "eslint_d", "prettierd", "prettier", stop_after_first = true },
typescriptreact = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
-- yaml = { "prettierd", "prettier", stop_after_first = true },
},
})
@@ -0,0 +1,7 @@
require("eyeliner").setup({
highlight_on_key = true,
dim = true,
})
vim.api.nvim_set_hl(0, "EyelinerPrimary", { bold = true, underline = true })
vim.api.nvim_set_hl(0, "EyelinerSecondary", { underline = true })
@@ -0,0 +1 @@
require("fidget").setup()
@@ -0,0 +1,16 @@
local fzf = require("fzf-lua")
fzf.setup({ "max-perf" })
vim.keymap.set("n", "<leader>f<leader>", fzf.builtin) -- Help
vim.keymap.set("n", "<leader>fc", fzf.commands)
vim.keymap.set("n", "<leader>ff", fzf.files)
vim.keymap.set("n", "<leader>fg", fzf.live_grep_native)
vim.keymap.set("n", "<leader>fb", fzf.buffers)
vim.keymap.set("n", "<leader>fd", fzf.diagnostics_workspace)
vim.keymap.set("n", "<leader>fhe", fzf.help_tags)
vim.keymap.set("n", "<leader>fhi", fzf.search_history)
vim.keymap.set("n", "<leader>fma", fzf.marks)
vim.keymap.set("n", "<leader>fmp", fzf.man_pages)
vim.keymap.set("i", "<c-f>", fzf.complete_path)
@@ -0,0 +1,12 @@
local gitsigns = require("gitsigns")
gitsigns.setup({
current_line_blame_formatter = "<author>, <author_time:%R> - <summary>",
-- linehl = true,
current_line_blame_opts = {
delay = 0,
virt_text_pos = "right_align",
},
})
vim.api.nvim_create_user_command("Blame", gitsigns.toggle_current_line_blame, { nargs = "?" })
@@ -0,0 +1,35 @@
local hydra_repl = "hydra-repl"
if not vim.fn.executable(hydra_repl) then
return
end
local function send(lines)
vim.system({ hydra_repl, table.concat(lines, "\n") })
end
local function get_paragraph(buf)
local start_ = vim.fn.search("^$", "bnW")
local end_ = vim.fn.search("^$", "nW") - 1
if end_ < vim.api.nvim_win_get_cursor(0)[1] then
end_ = vim.api.nvim_buf_line_count(buf)
end
return vim.api.nvim_buf_get_lines(buf, start_, end_, false)
end
local function get_selection(buf)
return vim.api.nvim_buf_get_lines(buf, vim.fn.line("'<") - 1, vim.fn.line("'>"), false)
end
vim.api.nvim_create_autocmd("FileType", {
pattern = "javascript",
callback = function(e)
if vim.fn.fnamemodify(vim.api.nvim_buf_get_name(e.buf), ":e") ~= "hydra" then
return
end
local buf = e.buf
vim.keymap.set("n", "<CR>", function() send(get_paragraph(buf)) end, { buffer = buf, desc = "hydra: send block" })
vim.keymap.set("v", "<CR>", function() send(get_selection(buf)) end, { buffer = buf, desc = "hydra: send selection" })
end,
})
@@ -0,0 +1,12 @@
if not vim.env.KITTY_WINDOW_ID then return end
require("image").setup({
backend = "kitty",
kitty_method = "normal",
processor = "magick_cli",
integrations = {
markdown = {
filetypes = { "markdown", "pandoc" },
},
},
})
@@ -0,0 +1 @@
require("kitty-scrollback").setup()
@@ -0,0 +1,7 @@
require("lsp_lines").setup()
vim.diagnostic.config({
virtual_text = false,
})
vim.keymap.set("", "<leader>dd", require("lsp_lines").toggle, { desc = "Toggle lsp_lines" })
@@ -0,0 +1,196 @@
require("neodev").setup() -- should setup before lspconfig
local cmp_nvim_lsp = require("cmp_nvim_lsp")
local capabilities = cmp_nvim_lsp.default_capabilities()
local servers = {
bashls = {},
eslint = {
settings = {
--Assuming prettier/prettierd will handle formatting, we don't need to see these errors
rulesCustomizations = {
{ rule = "prettier/prettier", severity = "off" },
},
format = false,
},
},
emmet_language_server = {},
gdscript = {},
helm_ls = {
filetypes = { "yaml", "helm", "yaml.helm-values" },
},
hls = { filetypes = { "haskell", "lhaskell", "cabal" } },
html = {},
jsonls = {
settings = {
json = {
schemas = require("schemastore").json.schemas(),
validate = { enable = true },
},
},
},
lua_ls = {
on_init = function(client)
if client.workspace_folders then
local path = client.workspace_folders[1].name
if
path ~= vim.fn.stdpath("config")
and (vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc"))
then
return
end
end
client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, {
runtime = {
version = "LuaJIT",
path = {
"lua/?.lua",
"lua/?/init.lua",
},
},
workspace = {
checkThirdParty = false,
library = {
vim.env.VIMRUNTIME,
},
},
})
end,
settings = {
Lua = {},
},
},
nixd = {
settings = {
nixd = {
nixpkgs = {
expr = "import <nixpkgs> { }",
expr = 'import (builtins.getFlake ("git+file://" + toString ../../../../../.)).inputs.nixpkgs { }',
},
},
options = {
nixos = {
expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).nixosConfigurations."'
.. vim.fn.hostname()
.. '".options',
},
home_manager = {
expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).homeConfigurations."'
.. vim.fn.expand("$USER")
.. "@"
.. vim.fn.hostname()
.. '".options',
},
},
},
},
openscad_ls = {},
pyright = {},
svelte = {
plugin = {
svelte = {
defaultScriptLanguage = "ts",
},
},
},
tailwindcss = {},
ts_ls = {},
-- vtsls = {
-- maxTsServerMemory = 16384,
-- filetypes = {
-- "javascript",
-- "javascriptreact",
-- "javascript.jsx",
-- "typescript",
-- "typescriptreact",
-- "typescript.tsx",
-- },
-- settings = {
-- complete_function_calls = true,
-- vtsls = {
-- enableMoveToFileCodeAction = true,
-- autoUseWorkspaceTsdk = true,
-- experimental = {
-- completion = {
-- enableServerSideFuzzyMatch = true,
-- },
-- },
-- },
-- typescript = {
-- updateImportsOnFileMove = { enabled = "always" },
-- suggest = {
-- completeFunctionCalls = true,
-- },
-- inlayHints = {
-- enumMemberValues = { enabled = true },
-- functionLikeReturnTypes = { enabled = true },
-- parameterNames = { enabled = "literals" },
-- parameterTypes = { enabled = true },
-- propertyDeclarationTypes = { enabled = true },
-- variableTypes = { enabled = false },
-- },
-- },
-- },
-- },
yamlls = {
settings = {
yaml = {
schemaStore = {
-- You must disable built-in schemaStore support if you want to use
-- this plugin and its advanced options like `ignore`.
enable = false,
-- Avoid TypeError: Cannot read properties of undefined (reading 'length')
url = "",
},
schemas = require("schemastore").yaml.schemas(),
},
},
},
}
for server, config in pairs(servers) do
config.capabilities = capabilities
vim.lsp.config(server, config)
end
vim.lsp.enable(vim.tbl_keys(servers))
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(e)
local opts = { buffer = e.bufnr }
local set = vim.keymap.set
local lsp_buf = vim.lsp.buf
set("n", "gD", lsp_buf.declaration, opts)
set("n", "gd", lsp_buf.definition, opts)
set("n", "K", lsp_buf.hover, opts)
set("n", "gi", lsp_buf.implementation, opts)
set("n", "<C-k>", lsp_buf.signature_help, opts)
set("n", "<space>wa", lsp_buf.add_workspace_folder, opts)
set("n", "<space>wr", lsp_buf.remove_workspace_folder, opts)
set("n", "<space>wl", function()
print(vim.inspect(lsp_buf.list_workspace_folders()))
end, opts)
set("n", "<space>D", lsp_buf.type_definition, opts)
set("n", "<space>rn", lsp_buf.rename, opts)
set({ "n", "v" }, "<space>ca", lsp_buf.code_action, opts)
set("n", "gr", lsp_buf.references, opts)
-- Taken from https://blog.viktomas.com/graph/neovim-lsp-rename-normal-mode-keymaps/
set("n", "<leader>r", vim.lsp.buf.rename)
-- function()
-- -- Automatically switch to `cmdwin` for normal mode renaming
-- -- (normally you would have to press <C-f> to open the `cmdwin`)
-- vim.api.nvim_create_autocmd({ "CmdlineEnter" }, {
-- callback = function()
-- local key = vim.api.nvim_replace_termcodes("<C-f>", true, false, true)
-- vim.api.nvim_feedkeys(key, "c", false)
-- vim.api.nvim_feedkeys("0", "n", false)
-- return true
-- end,
-- })
-- vim.lsp.buf.rename()
-- end, bufoptsWithDesc("Rename symbol")
-- )
end,
})
@@ -0,0 +1,13 @@
local ls = require("luasnip")
ls.config.set_config({
history = true,
update_events = "TextChanged,TextChangedI",
delete_check_events = "TextChanged",
ext_prio_increase = 1,
enable_autosnippets = true,
store_selection_keys = "<Tab>",
})
require("luasnip.loaders.from_lua").lazy_load({ paths = { "~/.config/nvim/snips" } })
require("luasnip.loaders.from_vscode").lazy_load({ paths = { "~/.config/Code - Insiders/User/snippets" } })
@@ -0,0 +1,5 @@
vim.cmd([[
" Paste clipboard images
au FileType pandoc nmap <buffer><silent> <leader>v :call mdip#MarkdownClipboardImage()<CR>
au FileType markdown nmap <buffer><silent> <leader>v :call mdip#MarkdownClipboardImage()<CR>
]])
@@ -0,0 +1,94 @@
local cmp = require("cmp")
local luasnip = require("luasnip")
-- TODO: Fix command mode completion (should behave similar to insert mode)
local c_j = cmp.mapping(function()
if cmp.visible() then
cmp.select_next_item()
else
cmp.complete()
cmp.select_next_item()
end
end, { "i", "s" })
local c_k = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
-- NOTE: Keep <C-k> fallback for digraphs
-- ```lua
-- cmp.complete()
-- cmp.select_prev_item()
-- ```
fallback()
end
end, { "i", "s" })
local c_h = cmp.mapping(function(fallback)
if luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { "i", "s" })
local c_l = cmp.mapping(function(fallback)
if cmp.visible() and cmp.get_active_entry() then
cmp.confirm()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { "i", "s" })
cmp.setup({
completion = {
autocomplete = false,
},
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
-- See `:h luasnip` for the commands
-- Note: have not added choice note mappings yet
mapping = cmp.mapping.preset.insert({
["<C-j>"] = c_j,
["<C-k>"] = c_k,
["<C-h>"] = c_h,
["<C-l>"] = c_l,
["<CR>"] = c_l,
}),
sources = {
{ name = "zk" },
{ name = "nvim_lsp" },
{ name = "luasnip", max_item_count = 16 },
{ name = "path" },
{ name = "buffer", max_item_count = 8 },
},
window = {
completion = cmp.config.window.bordered({ border = { "┌", "─", "┐", "│", "┘", "─", "└", "│" } }),
documentation = cmp.config.window.bordered({ border = { "┌", "─", "┐", "│", "┘", "─", "└", "│" } }),
},
formatting = {
fields = {
"abbr",
"menu",
"kind",
},
format = function(entry, item)
-- Rename kind to shorthand
item.menu = ({
nvim_lsp = "[lsp]",
luasnip = "[snip]",
path = "[path]",
buffer = "[buf]",
})[entry.source.name]
return item
end,
expandable_indicator = true,
},
})
@@ -0,0 +1 @@
require("dbee").setup()
@@ -0,0 +1 @@
require("nvim-highlight-colors").setup({})
@@ -0,0 +1,35 @@
vim.env.ESLINT_D_PPID = vim.fn.getpid()
local eslint_linter = "eslint_d"
require("lint").linters_by_ft = {
bash = { "shellcheck" },
c = { "clangtidy", "flawfinder" },
cmake = { "cmakelint" },
cpp = { "clangtidy", "flawfinder" }, -- "cpplint", "cppcheck", "flawfinder"
css = { "stylelint" },
dockerfile = { "hadolint" },
editorconfig = { "editorconfig-checker" },
haskell = { "hlint" },
-- html = { "htmlhint" },
-- javascript = { eslint_linter },
-- javascriptreact = { eslint_linter },
gdscript = { "gdlint" },
latex = { "chktex" },
-- lua = { "luacheck", "selene" },
make = { "checkmake" },
-- pandoc = { "proselint", "woke" },
-- python = { "pylint" },
sh = { "shellcheck" },
svelte = { eslint_linter },
systemd = { "systemdlint" },
-- typescript = { eslint_linter },
-- typescriptreact = { eslint_linter },
yaml = { "yamllint" },
}
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, {
callback = function()
require("lint").try_lint()
end,
})
@@ -0,0 +1,8 @@
require("ts_context_commentstring").setup({ enable_autocmd = false })
-- https://github.com/JoosepAlviste/nvim-ts-context-commentstring/issues/109
local get_option = vim.filetype.get_option
vim.filetype.get_option = function(filetype, option)
return option == "commentstring" and require("ts_context_commentstring.internal").calculate_commentstring()
or get_option(filetype, option)
end
@@ -0,0 +1,5 @@
vim.cmd([[
nmap s <Nop>
xmap s <Nop>
let g:sandwich#recipes = deepcopy(g:sandwich#default_recipes)
]])
@@ -0,0 +1,4 @@
require("sniprun").setup({
selected_interpreters = { "JS_TS_deno" },
repl_enable = { "JS_TS_deno" },
})
@@ -0,0 +1 @@
require("tailwind-fold").setup({ ft = { "html", "svelte", "tsx" } })
@@ -0,0 +1,125 @@
local vim = vim
local api = vim.api
local keymap = vim.keymap
local opt = vim.opt
local treesitter = require("nvim-treesitter")
local textobjects = require("nvim-treesitter-textobjects")
local select = require("nvim-treesitter-textobjects.select")
local treesj = require("treesj")
local is_nix = require("nixCatsUtils").isNixCats
if not is_nix then
treesitter.install({
"awk",
"bash",
"bibtex",
"c",
"cmake",
"comment",
"cpp",
"css",
"csv",
"diff",
"dockerfile",
"dot",
"gdscript",
"gdshader",
"git_config",
"git_rebase",
"gitattributes",
"gitcommit",
"gitignore",
"glsl",
"gnuplot",
"go",
"godot_resource",
"gpg",
"graphql",
"haskell",
"html",
"java",
"javascript",
"jq",
"jsdoc",
"json",
"jsonc",
"latex",
"lua",
"luadoc",
"make",
"python",
"query",
"r",
"racket",
"readline",
"regex",
"requirements",
"scheme",
"scss",
"sql",
"ssh_config",
"supercollider",
"svelte",
"tmux",
"toml",
"tsv",
"tsx",
"typescript",
"udev",
"vim",
"vimdoc",
"xml",
"yaml",
"zathurarc",
})
end
-- https://github.com/MeanderingProgrammer/treesitter-modules.nvim#implementing-yourself
api.nvim_create_autocmd("FileType", {
group = api.nvim_create_augroup("treesitter.setup", {}),
callback = function(args)
local buf = args.buf
local filetype = args.match
local language = vim.treesitter.language.get_lang(filetype) or filetype
if not (language and vim.treesitter.language.add(language)) then
return
end
-- fold
vim.wo.foldmethod = "expr"
vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()"
-- highlight
vim.treesitter.start(buf, language)
-- indent
vim.bo[buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
vim.bo[buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end,
})
opt.foldmethod = "expr"
opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
opt.foldenable = false
-- https://github.com/nvim-treesitter/nvim-treesitter-textobjects/blob/main/README.md#text-objects-select
textobjects.setup({
select = {
lookahead = true,
},
})
local function select_textobject(capture)
return function()
select.select_textobject(capture, "textobjects")
end
end
keymap.set({ "x", "o" }, "if", select_textobject("@function.inner"), { desc = "Inner function" })
keymap.set({ "x", "o" }, "af", select_textobject("@function.outer"), { desc = "A function" })
keymap.set({ "x", "o" }, "ip", select_textobject("@parameter.inner"), { desc = "Inner parameter" })
keymap.set({ "x", "o" }, "ap", select_textobject("@parameter.outer"), { desc = "A parameter" })
treesj.setup({
use_default_keymaps = false,
})
keymap.set("n", ";", treesj.toggle, { desc = "Toggle join/split (TreeSJ)" })
@@ -0,0 +1 @@
require("trouble").setup()
@@ -0,0 +1,8 @@
vim.cmd([[
let g:javascript_plugin_jsdoc = 1 " jsdoc syntax highlighting
let g:javascript_plugin_flow = 1 " flow syntax highlighting
let g:javascript_conceal_function = "ƒ"
let g:javascript_conceal_return = "⇖"
let g:svelte_indent_script = 0
let g:svelte_indent_style = 0
]])
@@ -0,0 +1,17 @@
vim.cmd([[
let g:pandoc#syntax#conceal#urls=1
let g:pandoc#syntax#codeblocks#embeds#langs=[
\ 'python',
\ 'bash',
\ 'javascript',
\ 'typescript',
\ 'html',
\ 'css',
\ 'scss',
\ 'json',
\ 'yaml'
\ ]
let g:pandoc#syntax#style#emphases=0 " Bug workaround
let g:pandoc#syntax#conceal#cchar_overrides = { "atx": " ", "li": "·" }
let g:pandoc#syntax#conceal#blacklist=[]
]])
@@ -0,0 +1,9 @@
vim.cmd([[
au FileType pandoc call pandoc#completion#Init()
let g:pandoc#filetypes#pandoc_markdown=0
let g:pandoc#spell#enabled=0
let g:pandoc#spell#default_langs=['en_us', 'nl_be']
let g:pandoc#formatting#mode='a'
let g:pandoc#formatting#textwidth=90
let g:pandoc#modules#disabled = ["formatting", "dashes", "yaml", "metadata"]
]])
@@ -0,0 +1,28 @@
vim.g.tidal_default_config = { socket_name = "default", target_pane = "tidal:1.1" }
vim.g.tidal_no_mappings = 1
vim.api.nvim_create_autocmd("FileType", {
pattern = "tidal",
callback = function(e)
local buf = e.buf
vim.keymap.set("n", "<leader>ep", "<Plug>TidalParagraphSend", { buffer = buf, desc = "Tidal: send paragraph" })
vim.keymap.set("n", "<leader>ee", "<Plug>TidalLineSend", { buffer = buf, desc = "Tidal: send line" })
vim.keymap.set("n", "<leader>h", ":TidalHush<cr>", { buffer = buf, desc = "Tidal: hush" })
vim.api.nvim_buf_create_user_command(buf, "S", "TidalSilence <args>", { nargs = 1 })
vim.api.nvim_buf_create_user_command(buf, "P", "TidalPlay <args>", { nargs = 1 })
vim.api.nvim_buf_create_user_command(buf, "H", "TidalHush", { nargs = 0 })
end,
})
-- SuperCollider
vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter", "BufNewFile", "BufRead" }, {
pattern = { "*.sc", "*.scd" },
callback = function()
vim.bo.filetype = "supercollider"
end,
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "supercollider",
command = "packadd scvim",
})
@@ -0,0 +1,6 @@
vim.cmd([[
let g:vimtex_view_method='zathura'
let g:tex_flavor='latex'
let g:tex_conceal='abdmgs'
let g:vimtex_quickfix_mode=0
]])
@@ -0,0 +1,14 @@
local function overrides()
local colors = require("vscode.colors").get_colors()
vim.api.nvim_set_hl(0, "NormalFloat", { bg = colors.vscLeftDark })
vim.api.nvim_set_hl(0, "FloatBorder", { fg = colors.vscSplitDark, bg = colors.vscLeftDark })
end
vim.api.nvim_create_autocmd("ColorScheme", {
pattern = "vscode",
callback = overrides,
})
if vim.g.colors_name == "vscode" then
overrides()
end
@@ -0,0 +1,117 @@
require("zk.utils")
vim.cmd([[
" Change local buffer to directory of current file after the plugin has loaded
execute 'autocmd BufEnter' g:zk_path . '/*.md' 'silent lcd %:p:h'
" " Override wiki index mapping to also cd into the wiki
nm <leader>ww <plug>(wiki-index)
" nm <leader>l <plug>(wiki-next-link)
" nm <leader>h <plug>(wiki-prev-link)
" nm <leader>j <plug>(wiki-link-follow)
" nm <leader>k <plug>(wiki-link-return)
" nm <leader>s <plug>(wiki-link-follow-split)
" nm <leader>v <plug>(wiki-link-follow-vsplit)
function! ZKContextualEcho()
let l:name = expand('%:t')
if l:name =~ '_' | echo 'hierarchical relation'
elseif l:name =~ '--' | echo 'relation'
elseif l:name =~ '<>' | echo 'dichotomy'
elseif l:name =~ 'my-' | echo 'personal file'
elseif l:name =~ 'project_' | echo 'project file'
endif
endfunction
execute 'autocmd BufEnter' g:zk_path . '/*.md' 'call ZKContextualEcho()'
" Only load wiki.vim for zk directory
let g:wiki_index_name='index'
" Links
let g:wiki_link_extension=''
" Do not automatically transform to link, use `<leader>wf` for this
let g:wiki_link_target_type='md'
vmap <leader>wf <plug>(wiki-link-toggle-visual)
"
" Links
"
"
" Options
"
"
" Events
"
"
" Mappings and commands
"
"
" Completion
"
let g:wiki_completion_enabled=1
let g:wiki_completion_case_sensitive=0
"
" Tags
"
"
" Templates
"
let g:wiki_templates = [
\ { 'match_re': '^my-',
\ 'source_filename': '.my.md'},
\ { 'match_re': '^project[-_]',
\ 'source_filename': '.project.md'},
\ { 'match_re': '^blog[-_]',
\ 'source_filename': '.blog.md'},
\ { 'match_re': '^journal[-_]',
\ 'source_filename': '.journal.md'},
\ { 'match_func': { x -> v:true },
\ 'source_filename': '.md'},
\]
"
" Advanced configuration
"
let g:wiki_filetypes=['md']
let g:wiki_root=g:zk_path
let g:wiki_global_load=0
let g:wiki_link_creation = {
\ 'md': {
\ 'link_type': 'md',
\ 'url_extension': '',
\ 'url_transform': { x -> substitute(tolower(x), '\s\+', '-', 'g') },
\ },
\ '_': {
\ 'link_type': 'wiki',
\ 'url_extension': '',
\ },
\}
" let g:wiki_link_default_schemes
" let g:wiki_link_schemes
let g:wiki_link_toggle_on_follow=0
" let g:wiki_link_transforms
" let g:wiki_mappings_use_defaults
" let g:wiki_mappings_global
" let g:wiki_mappings_local
" let g:wiki_mappings_local_journal
" ... tags
" let g:wiki_template_month_names
" let g:wiki_template_title_month =
" let g:wiki_template_title_week
" let g:wiki_ui_method
let g:wiki_write_on_nav=1
let g:wiki_zotero_root='~/.local/share/zotero'
" ... mappings and commands
" ...
]])
@@ -0,0 +1,7 @@
vim.cmd([[
syn match Todo /TODO/
syn match Todo /FIXME/
syn match Todo /FIX/
syn match Todo /QUESTION/
syn match Todo /NOTE/
]])
@@ -0,0 +1,19 @@
vim.cmd([[
" Override the pandoc-syntax highlighting colors for more subtle citations
hi! link pandocPCite Comment
hi! link pandocICite Comment
hi! link pandocCiteKey Comment
hi! link pandocCiteAnchor Comment
hi! link pandocCiteLocator Comment
" Match cloze delimiters e.g. `{{c1::` and `}}`
syn match ClozeDelimiter /{{c\d\+::/ conceal containedin=pandocUListItem,pandocListItem
syn match ClozeDelimiter /}}/ conceal containedin=pandocUListItem,pandocListItem
" Match text between cloze delimiters
syn match Cloze /\({{c\d\+::\)\@<=\(\_[A-Za-z0-9$\ \\\-\*,_`()]*\)\(}}\)\@=/ containedin=pandocUListItem,pandocListItem
hi! link ClozeDelimiter Special
hi! link Cloze Special
]])
vim.cmd.runtime("syntax/_comment_keywords.lua")
@@ -0,0 +1,7 @@
vim.cmd([[
syn keyword Operator \+ conceal cchar=¬
syn keyword Operator , conceal cchar=∧
syn keyword Operator ; conceal cchar=∨
]])
vim.cmd.runtime("syntax/_comment_keywords.lua")
@@ -0,0 +1,41 @@
vim.cmd([[
syntax keyword Statement define conceal cchar=≔
syn keyword Operator not conceal cchar=¬
syn keyword Operator and conceal cchar=∧
syn keyword Operator or conceal cchar=∨
syn keyword Operator mod conceal cchar=%
syn keyword Operator exp conceal cchar=^
syn keyword Operator sqrt conceal cchar=√
syn keyword Operator quote conceal cchar='
" Conceal greek letters
syn keyword Operator alpha conceal cchar=α
syn keyword Operator beta conceal cchar=β
syn keyword Operator gamma conceal cchar=γ
syn keyword Operator delta conceal cchar=δ
syn keyword Operator epsilon conceal cchar=ε
syn keyword Operator zeta conceal cchar=ζ
syn keyword Operator eta conceal cchar=η
syn keyword Operator theta conceal cchar=θ
syn keyword Operator iota conceal cchar=ι
syn keyword Operator kappa conceal cchar=κ
syn keyword Operator lambda conceal cchar=λ
syn keyword Operator mu conceal cchar=μ
syn keyword Operator nu conceal cchar=ν
syn keyword Operator xi conceal cchar=ξ
syn keyword Operator omicron conceal cchar=ο
syn keyword Operator pi conceal cchar=π
syn keyword Operator rho conceal cchar=ρ
syn keyword Operator sigma conceal cchar=σ
syn keyword Operator tau conceal cchar=τ
syn keyword Operator upsilon conceal cchar=υ
syn keyword Operator phi conceal cchar=φ
syn keyword Operator chi conceal cchar=χ
syn keyword Operator psi conceal cchar=ψ
syn keyword Operator omega conceal cchar=ω
]])
vim.cmd.runtime("syntax/_comment_keywords.lua")
+111
View File
@@ -0,0 +1,111 @@
{
"nodes": {
"nixCats": {
"locked": {
"lastModified": 1777273601,
"narHash": "sha256-xBUa8Tl9V7IXI+VmLEuDc81La/EhoSn1C3EVSnJ3cfU=",
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"rev": "f69ea013e328841a7def7037ed59788a76be8816",
"type": "github"
},
"original": {
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1787424095,
"narHash": "sha256-dWLO5AHhKaw6rdWCtTes8hnntT1r0/J5yhQGm0f0ZgU=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "174eb786fb68e3a13e4e535a3deea479a0c07a6a",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"plugins-beancount-nvim": {
"flake": false,
"locked": {
"lastModified": 1707748314,
"narHash": "sha256-LuACGVB3kiaiJqoGtvFy6kbPNtqoGliKLDeR+Z7Wzbw=",
"owner": "polarmutex",
"repo": "beancount.nvim",
"rev": "869564aba3087ee5df8f282aa37555e314aa2152",
"type": "github"
},
"original": {
"owner": "polarmutex",
"repo": "beancount.nvim",
"type": "github"
}
},
"plugins-nvimkit-nvim": {
"flake": false,
"locked": {
"lastModified": 1721393835,
"narHash": "sha256-MdmrhLHMxrn6upu1chjKyitPZ5WkCQtpI465AKJXDOA=",
"owner": "jamesblckwell",
"repo": "nvimkit.nvim",
"rev": "af363d22699760f66988e8d36539a5753039217a",
"type": "github"
},
"original": {
"owner": "jamesblckwell",
"repo": "nvimkit.nvim",
"type": "github"
}
},
"plugins-shipwright-nvim": {
"flake": false,
"locked": {
"lastModified": 1711725275,
"narHash": "sha256-xh/2m//Cno5gPucjOYih79wVZj3X1Di/U3/IQhKXjc0=",
"owner": "rktjmp",
"repo": "shipwright.nvim",
"rev": "e596ab48328c31873f4f4d2e070243bf9de16ff3",
"type": "github"
},
"original": {
"owner": "rktjmp",
"repo": "shipwright.nvim",
"type": "github"
}
},
"plugins-tailwind-fold-nvim": {
"flake": false,
"locked": {
"lastModified": 1766077142,
"narHash": "sha256-SwcDLlygXUSV/dytPXA5Y45OpUhjnExc8SZg5a8MZ2k=",
"owner": "razak17",
"repo": "tailwind-fold.nvim",
"rev": "e2ba5ee1ca9b74208709fe9d7314b8aa753b26a7",
"type": "github"
},
"original": {
"owner": "razak17",
"repo": "tailwind-fold.nvim",
"type": "github"
}
},
"root": {
"inputs": {
"nixCats": "nixCats",
"nixpkgs": "nixpkgs",
"plugins-beancount-nvim": "plugins-beancount-nvim",
"plugins-nvimkit-nvim": "plugins-nvimkit-nvim",
"plugins-shipwright-nvim": "plugins-shipwright-nvim",
"plugins-tailwind-fold-nvim": "plugins-tailwind-fold-nvim"
}
}
},
"root": "root",
"version": 7
}
+292
View File
@@ -0,0 +1,292 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
nixCats.url = "github:BirdeeHub/nixCats-nvim";
plugins-shipwright-nvim = {
url = "github:rktjmp/shipwright.nvim";
flake = false;
};
# plugins-m-taskwarrior-d-nvim = {
# url = "github:huantrinh1802/m_taskwarrior_d.nvim";
# flake = false;
# };
plugins-beancount-nvim = {
url = "github:polarmutex/beancount.nvim";
flake = false;
};
plugins-tailwind-fold-nvim = {
url = "github:razak17/tailwind-fold.nvim";
flake = false;
};
plugins-nvimkit-nvim = {
url = "github:jamesblckwell/nvimkit.nvim";
flake = false;
};
};
outputs =
{
nixpkgs,
nixCats,
...
}@inputs:
let
inherit (nixCats) utils;
luaPath = ./.;
forEachSystem = utils.eachSystem nixpkgs.lib.platforms.all;
extra_pkg_config = {
allowUnfreePredicate =
pkg:
builtins.elem (nixpkgs.lib.getName pkg) [
"vim-sandwich"
"jupytext.nvim"
"eyeliner.nvim"
"context_filetype.vim"
"editorconfig-vim"
"unicode.vim"
"quarto-nvim"
"vim-openscad"
"lsp_lines.nvim"
"nvim-highlight-colors"
"nvim-lint"
];
};
mkDependencyOverlays = [
(utils.standardPluginOverlay inputs)
(_: prev: {
luajitPackages = prev.luajitPackages.overrideScope (
_: lprev: {
neotest = lprev.neotest.overrideAttrs (_: {
doCheck = false;
});
}
);
})
];
categoryDefinitions =
{
pkgs,
categories,
...
}:
let
themes = import ./themes.nix pkgs;
in
{
lspsAndRuntimeDeps = with pkgs; {
general = [
nodejs_24
black
clang
clang-tools
curl # → plenary-nvim
delta
emmet-language-server
eslint_d
fd
gawk
gdtoolkit_4
hadolint
helm-ls
isort
lua-language-server
nixd
nixfmt
prettier
typescript-language-server
ormolu
prettierd
rust-analyzer
rustfmt
shellcheck-minimal
stylelint
stylua
tree-sitter
tailwindcss-language-server
typescript-language-server
vscode-langservers-extracted
vtsls
yaml-language-server
yamllint
];
};
startupPlugins = {
general =
with pkgs.vimPlugins;
[
## plug
vim-plug
vim-sandwich
context_filetype-vim
editorconfig-vim
vim-snippets
unicode-vim
vim-css-color
quarto-nvim
vimtex
wiki-vim
vim-pandoc
vim-pandoc-syntax
# TODO: ferrine/md-img-paste.vim
# TODO: supercollider/scvim
# TODO: tidalcycles/vim-tidal
vim-glsl
# TODO: timtro/glslView-nvim
# TODO: sirtaj/vim-openscad
jupytext-nvim
vim-openscad
## paq
eyeliner-nvim
fzf-lua
ltex_extra-nvim
nvim-lspconfig
lsp_lines-nvim
lsp-progress-nvim
neodev-nvim
SchemaStore-nvim
nvim-lint
conform-nvim
luasnip
cmp_luasnip
nvim-cmp
cmp-nvim-lsp
cmp-buffer
cmp-path
plenary-nvim
nui-nvim
trouble-nvim
lush-nvim
pkgs.neovimPlugins.shipwright-nvim
nvim-treesitter.withAllGrammars
nvim-treesitter-textobjects
# nvim-treesitter-context
nvim-ts-context-commentstring
# theHamsta/crazy-node-movement
treesj
sniprun
gitsigns-nvim
nvim-highlight-colors
pkgs.neovimPlugins.tailwind-fold-nvim
auto-session
nvim-dbee
image-nvim
pkgs.neovimPlugins.beancount-nvim
pkgs.neovimPlugins.nvimkit-nvim
codecompanion-nvim
helm-ls-nvim
kitty-scrollback-nvim
fidget-nvim
rustaceanvim
# pkgs.neovimPlugins.m-taskwarrior-d-nvim
claudecode-nvim
snacks-nvim
]
++ themes.${categories.colorscheme or "zenwritten"};
};
optionalPlugins = {
general = with pkgs.vimPlugins; [
];
};
sharedLibraries = {
general = [ ];
};
environmentVariables = { };
};
packageDefinitions = {
nvim = _: {
settings = {
suffix-path = true;
suffix-LD = true;
wrapRc = true;
aliases = [ "vim" ];
};
categories = {
general = true;
colorscheme = "zenwritten";
};
};
};
defaultPackageName = "nvim";
in
forEachSystem (
system:
let
dependencyOverlays = mkDependencyOverlays;
nixCatsBuilder = utils.baseBuilder luaPath {
inherit
nixpkgs
system
dependencyOverlays
extra_pkg_config
;
} categoryDefinitions packageDefinitions;
defaultPackage = nixCatsBuilder defaultPackageName;
pkgs = import nixpkgs { inherit system; };
in
{
packages = utils.mkAllWithDefault defaultPackage;
devShells = {
default = pkgs.mkShell {
name = defaultPackageName;
packages = [ defaultPackage ];
inputsFrom = [ ];
shellHook = "";
};
};
}
)
// (
let
nixosModule = utils.mkNixosModules {
moduleNamespace = [ defaultPackageName ];
inherit
defaultPackageName
luaPath
categoryDefinitions
packageDefinitions
extra_pkg_config
nixpkgs
;
dependencyOverlays = mkDependencyOverlays;
};
homeModule = utils.mkHomeModules {
moduleNamespace = [ defaultPackageName ];
inherit
defaultPackageName
luaPath
categoryDefinitions
packageDefinitions
extra_pkg_config
nixpkgs
;
dependencyOverlays = mkDependencyOverlays;
};
in
{
overlays = utils.makeOverlays luaPath {
inherit nixpkgs extra_pkg_config;
dependencyOverlays = mkDependencyOverlays;
} categoryDefinitions packageDefinitions defaultPackageName;
nixosModules.default = nixosModule;
homeModules.default = homeModule;
inherit utils nixosModule homeModule;
inherit (utils) templates;
}
);
}
@@ -0,0 +1 @@
vim.opt.matchpairs:append("=:;")
@@ -0,0 +1,16 @@
local json_newline = function()
local line = vim.api.nvim_get_current_line()
if line == "" then
return "o"
elseif string.byte(line, -1) == string.byte(",") then
return "o"
elseif string.byte(line, -1) == string.byte("{") then
return "o"
elseif string.byte(line, -1) == string.byte("}") then
return "o"
else
return "A,<CR>"
end
end
vim.keymap.set("n", "o", json_newline, { buffer = true, expr = true })
@@ -0,0 +1,24 @@
vim.cmd([[
" Anki helper functions
" Convert cloze note to regular text
"
" * `AnkiRemoveAllClozes` all cloze notes in file
" * `AnkiRemoveSelectedClozes` all clozes in selected range
"
" E.g.
"
" ```markdown
" START
" Cloze
" In this sentence {{c1::this word}} was closed.
" END
" ```
"
" ```markdown
" In this sentence this word was closed.
" ```
au FileType pandoc com! -range AnkiRemoveAllClozes :%s/\%V{{c\d\+:://ge | :%s/\%V}}//ge | :%s/\%VSTART\nCloze\n//ge | :%s/\%VEND\n//ge
au FileType pandoc com! -range AnkiRemoveSelectedClozes :%s/\%V{{c\d\+:://ge | :%s/\%V}}//ge | :%s/\%VSTART\nCloze\n//ge | :%s/\%VEND\n//ge
]])
@@ -0,0 +1,36 @@
-- NOTE: May want to move this, as it is more specific to wiki than to pandoc
vim.api.nvim_create_user_command("AnkiDeck", function()
local handle = io.popen("get-anki-decks")
local decks = {}
for line in handle:lines() do
table.insert(decks, line)
end
handle:close()
vim.ui.select(decks, { prompt = "Select Anki deck" }, function(choice)
if choice then
vim.api.nvim_put({ choice }, "", true, true)
end
end)
end, {})
vim.cmd([[
set cocu=""
func! GetContext()
" https://stackoverflow.com/questions/9464844/how-to-get-group-name-of-highlighting-under-cursor-in-vim
if !exists("*synstack")
return
endif
let matches = map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
if index(matches, 'pandocLaTeXInlineMath') >= 0
echo 'math_inline'
elseif index(matches, 'pandocLaTeXMathBlock') >= 0
echo 'math_block'
elseif !empty(matches)
echo matches[0]
else
echo ''
endif
endfunc
com! -nargs=0 GetContext :call GetContext()
]])
@@ -0,0 +1,27 @@
vim.cmd([[
"
" Source: https://wiki.call-cc.org/vim / Jonathan Palardy
"
" Note, this is assuming you have an R5RS Scheme REPL runnning in the second
" TMUX pane.
" Send `(load <current-file>)` to tmux pane
nmap <leader>rf :call Scheme_send_sexp("(#%require xrepl)(load \"" . expand("%:p") . "\")\n")<cr>
nmap <leader>re :call Scheme_eval_defun()<cr>
" Send s-expression to TMUX buffer
fun! Scheme_send_sexp(sexp)
let ss = escape(a:sexp, '\"')
" Send to second tmux pane
call system("tmux send-keys -t 1 \"" . ss . "\n\"")
endfun
" Send s-expression under cursor to TMUX buffer
fun! Scheme_eval_defun()
let pos = getpos('.')
silent! exec "normal! 99[(yab"
call Scheme_send_sexp(@")
call setpos('.', pos)
endfun
]])
+19
View File
@@ -0,0 +1,19 @@
require("nixCatsUtils").setup({ non_nix_value = true }) -- https://github.com/BirdeeHub/nixCats-nvim/blob/77dffad8235eb77684fcb7599487c8e9f23d5b8f/templates/example/init.lua
vim.opt.termguicolors = true
vim.api.nvim_set_hl(0, "Normal", { ctermbg = "NONE", bg = "NONE" })
require("base")
require("cursor")
require("fold")
require("netrw")
require("ftdetect")
require("pandoc")
require("keymaps")
require("highlight")
require("statusline")
require("diagnostic")
require("utils")
require("zk")
require("reload")
require("theme")
+29
View File
@@ -0,0 +1,29 @@
vim.cmd([[
" Tip: acronyms for overview, use `:h` for a quick lookup.
set nocp " Disable vi incompatibility
filetype plugin indent on " Filetype recognition
set enc=utf8 " Default to UTF-8 encoding
set hid " Allow hiding unsaved buffers
set tf " Fast tty
set ut=300 " 300ms for update time
set to tm=200 ttm=5 " Timeouts
set shm+=c " ...
set ul=500 hi=500 " History and undo
set nu rnu scl=number " Line numbers & signs
set nowrap
set bs=indent,eol,start " Indentation
set ai ts=2 sts=2 sw=2 et " Indentation
set is ic scs hls " Search
set lz " Only essential redraws
set nobk nowb noswf " No backups
set vi='20,\"101 " Max 100 lines in registers
set novb " Bell
set cole=0 cocu="" " Conceal
set cb=unnamedplus " Clipboard
set fcs+=vert:│ " Cleaner split separator (tmux style)
set list
set lcs=trail:·,tab:→\ ,nbsp:␣ " Whitespace rendering
set ar " Autoread
set spellsuggest+=5 " Limit spell suggestions
set wildignore+=*/node_modules/*,*/tmp/*,*.so,*.swp,*.zip
]])
+16
View File
@@ -0,0 +1,16 @@
vim.cmd([[
" Taken from /usr/share/vim/vim90/defaults.vim
augroup vimStartup
au!
" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid, when inside an event handler
" (happens when dropping a file on gvim) and for a commit message (it's
" likely a different one than last time).
autocmd BufReadPost *
\ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
\ | exe "normal! g`\""
\ | endif
augroup END
]])
@@ -0,0 +1,10 @@
-- Source: <https://vonheikemen.github.io/devlog/tools/neovim-lsp-client-guide/>
vim.diagnostic.config({
signs = true,
underline = false,
severity_sort = true,
})
vim.keymap.set("n", "<leader>dl", vim.diagnostic.open_float)
vim.keymap.set("n", "<leader>dj", vim.diagnostic.goto_prev)
vim.keymap.set("n", "<leader>dk", vim.diagnostic.goto_next)
+26
View File
@@ -0,0 +1,26 @@
vim.cmd([[
" Folds {{{
set foldmethod=marker
augroup filetype_vim
autocmd!
autocmd FileType vim setlocal foldmethod=marker
augroup END
augroup filetype_python
autocmd!
autocmd FileType python setlocal foldmethod=indent
augroup END
augroup filetype_sh
autocmd!
autocmd FileType sh setlocal foldmethod=marker
augroup END
augroup filetype_snippets
autocmd!
autocmd FileType snippets setlocal foldmethod=marker
augroup END
" }}}
]])
+14
View File
@@ -0,0 +1,14 @@
vim.filetype.add({
filename = {
[".lintstagedrc"] = "json",
},
pattern = {
["tsconfig.*.json"] = "jsonc",
[".*/%.vscode/.*%.json"] = "jsonc",
[".*/%.ssh/config%.d/.*"] = "sshconfig",
["%.env.*"] = "dotenv",
["%.pl$"] = "prolog",
[".*.containerfile.*"] = "dockerfile",
["%.hydra$"] = "javascript",
},
})
@@ -0,0 +1,14 @@
local autocmd = vim.api.nvim_create_autocmd
local augroup = vim.api.nvim_create_augroup
local function yank_highlight()
vim.highlight.on_yank({ higroup = "Visual", timeout = 150 })
end
-- Yanked text highlight feedback (source: https://github.com/nvim-lua/kickstart.nvim/blob/master/init.lua)
augroup("YankHighlight", { clear = true })
autocmd("TextYankPost", {
desc = "Highlight when yanking (copying) text",
group = "YankHighlight",
callback = yank_highlight,
})
+55
View File
@@ -0,0 +1,55 @@
vim.g.mapleader = " "
vim.g.maplocalleader = ";"
local set = vim.keymap.set
-- splits & navigation
set("n", "s", "<c-w>", { desc = "window prefix" })
set("n", "ss", ":sp<CR><c-w>w", { desc = "split horizontal" })
set("n", "sv", ":vs<CR><c-w>w", { desc = "split vertical" })
set("n", "sw", "<c-w>w", { desc = "navigate splits" })
set("n", "sh", "<c-w>h", { desc = "focus left split" })
set("n", "sj", "<c-w>j", { desc = "focus below split" })
set("n", "sk", "<c-w>k", { desc = "focus above split" })
set("n", "sl", "<c-w>l", { desc = "focus right split" })
set("n", "sH", "<c-w>8<", { desc = "shrink split left" })
set("n", "sJ", "<c-w>8-", { desc = "shrink split down" })
set("n", "sK", "<c-w>8+", { desc = "grow split up" })
set("n", "sL", "<c-w>8>", { desc = "grow split right" })
set("n", "s=", "<c-w>=", { desc = "equalize splits" })
-- open
set("n", "sb", ":Lex<cr>", { desc = "file tree" })
set("n", "<leader><leader>", ":noh<cr>", { desc = "clear highlights" })
set("n", "<leader>t", ":term<cr>", { desc = "open terminal" })
set("n", "<leader>w", "<cmd>w<cr>", { desc = ":w" })
-- remaps
set("i", "jj", "<esc>", { nowait = true, desc = "exit insert mode" })
set("n", "<left>", "<nop>")
set("n", "<down>", "<nop>")
set("n", "<up>", "<nop>")
set("n", "<right>", "<nop>")
set("i", "<left>", "<nop>")
set("i", "<down>", "<nop>")
set("i", "<up>", "<nop>")
set("i", "<right>", "<nop>")
-- line numbers
set("n", "<leader>n", ":set nu! rnu!<cr>", { desc = "toggle line numbers" })
-- vim configuration
set("n", "<leader>ec", ":vs $MYVIMRC<cr>", { desc = "edit vimrc" })
set("n", "<leader>so", ":so %<cr>", { desc = "source current file" })
set("n", "<leader>cx", "<cmd>!chmod +x %<CR>", { silent = true, desc = "run `chmod +x` on current file" })
set("n", "yp", "<cmd>let @+ = expand('%r')<CR>:p<CR>", { silent = true, desc = "yank path" })
-- remap native NeoVim comment keymaps
set({ "n", "x" }, "<leader>c", "gc", { remap = true, desc = "toggle comment" })
set("n", "<leader>cc", "gcc", { remap = true, desc = "toggle comment line" })
set("o", "<leader>c", "gc", { remap = true, desc = "comment textobject" })
-- move lines
set("v", "K", ": '<,'>move '<-2<cr>gv", { desc = "move selection up" })
set("v", "J", ": '<,'>move '>+1<cr>gv", { desc = "move selection down" })
+5
View File
@@ -0,0 +1,5 @@
vim.cmd([[
let g:netrw_winsize = 30
let g:netrw_liststyle=3
let g:netrw_banner = 0
]])
@@ -0,0 +1,136 @@
-- Source: https://github.com/BirdeeHub/nixCats-nvim/blob/main/templates/example/lua/nixCatsUtils/init.lua
--[[
This directory is the luaUtils template.
You can choose what things from it that you would like to use.
And then delete the rest.
Everything in this directory is optional.
--]]
local M = {}
--[[
This file is for making your config still work WITHOUT nixCats.
When you don't use nixCats to load your config,
you wont have the nixCats plugin.
The setup function defined here defines a mock nixCats plugin when nixCats wasnt used to load the config.
This will help avoid indexing errors when the nixCats plugin doesnt exist.
NOTE: If you only ever use nixCats to load your config, you don't need this file.
--]]
---@type boolean
M.isNixCats = vim.g[ [[nixCats-special-rtp-entry-nixCats]] ] ~= nil
---@class nixCatsSetupOpts
---@field non_nix_value boolean|nil
---This function will setup a mock nixCats plugin when not using nix
---It will help prevent you from running into indexing errors without a nixCats plugin from nix.
---If you loaded the config via nix, it does nothing
---non_nix_value defaults to true if not provided or is not a boolean.
---@param v nixCatsSetupOpts
function M.setup(v)
if not M.isNixCats then
local nixCats_default_value
if type(v) == "table" and type(v.non_nix_value) == "boolean" then
nixCats_default_value = v.non_nix_value
else
nixCats_default_value = true
end
local mk_with_meta = function(tbl)
return setmetatable(tbl, {
__call = function(_, attrpath)
local strtable = {}
if type(attrpath) == "table" then
strtable = attrpath
elseif type(attrpath) == "string" then
for key in attrpath:gmatch("([^%.]+)") do
table.insert(strtable, key)
end
else
print("function requires a table of strings or a dot separated string")
return
end
return vim.tbl_get(tbl, unpack(strtable))
end,
})
end
package.preload["nixCats"] = function()
local ncsub = {
get = function(_)
return nixCats_default_value
end,
cats = mk_with_meta({
nixCats_config_location = vim.fn.stdpath("config"),
wrapRc = false,
}),
settings = mk_with_meta({
nixCats_config_location = vim.fn.stdpath("config"),
configDirName = os.getenv("NVIM_APPNAME") or "nvim",
wrapRc = false,
}),
petShop = mk_with_meta({}),
extra = mk_with_meta({}),
pawsible = mk_with_meta({
allPlugins = {
start = {},
opt = {},
},
}),
configDir = vim.fn.stdpath("config"),
packageBinPath = os.getenv("NVIM_WRAPPER_PATH_NIX") or vim.v.progpath,
}
return setmetatable(ncsub, {
__call = function(_, cat)
return ncsub.get(cat)
end,
})
end
_G.nixCats = require("nixCats")
end
end
---allows you to guarantee a boolean is returned, and also declare a different
---default value than specified in setup when not using nix to load the config
---@overload fun(v: string|string[]): boolean
---@overload fun(v: string|string[], default: boolean): boolean
function M.enableForCategory(v, default)
if M.isNixCats or default == nil then
if nixCats(v) then
return true
else
return false
end
else
return default
end
end
---if nix, return value of nixCats(v) else return default
---Exists to specify a different non_nix_value than the one in setup()
---@param v string|string[]
---@param default any
---@return any
function M.getCatOrDefault(v, default)
if M.isNixCats then
return nixCats(v)
else
return default
end
end
---for conditionally disabling build steps on nix, as they are done via nix
---I should probably have named it dontAddIfCats or something.
---@overload fun(v: any): any|nil
---Will return the second value if nix, otherwise the first
---@overload fun(v: any, o: any): any
function M.lazyAdd(v, o)
if M.isNixCats then
return o
else
return v
end
end
return M
+12
View File
@@ -0,0 +1,12 @@
vim.cmd([[
fu! Compile()
if expand('%:e') == "md"
:silent exec "!pandoc % -s -o /tmp/op.pdf &"
endif
endfu
fu! Preview()
:call Compile()
:silent exec "!zathura /tmp/op.pdf &"
endfu
]])
+7
View File
@@ -0,0 +1,7 @@
vim.cmd([[
augroup Vim
au!
" Reload vim config when ~/.vimrc is changed
au BufWritePost $HOME/.vimrc so $MYVIMRC | redraw | echo "Reloaded vimrc"
augroup END
]])
@@ -0,0 +1,11 @@
local autocmd = vim.api.nvim_create_autocmd
autocmd("BufNewFile", {
pattern = "shell.nix",
command = "0r ~/.config/nvim/skeletons/shell.nix.skeleton",
})
autocmd("BufNewFile", {
pattern = "flake.nix",
command = "0r ~/.config/nvim/skeletons/flake.nix.skeleton",
})
@@ -0,0 +1,10 @@
vim.opt.laststatus = 3
vim.cmd([[
se stl=\ %0*%n
se stl+=\ %m
se stl+=\ %y%0*
se stl+=\ %<%F
se stl+=\ %0*%=%5l%*
se stl+=%0*/%L%*
]])
+8
View File
@@ -0,0 +1,8 @@
vim.opt.background = "dark"
if vim.g.vscode then
return
end
vim.g.zenwritten_compat = 1
vim.cmd.colorscheme(require("nixCatsUtils").getCatOrDefault("colorscheme", "zenwritten"))
+8
View File
@@ -0,0 +1,8 @@
vim.cmd([[
function! SynGroup()
let l:s = synID(line('.'), col('.'), 1)
echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
endfun
com! -nargs=0 Syn :call SynGroup()
]])
+52
View File
@@ -0,0 +1,52 @@
local cmp = require("cmp")
local source = {}
local function get_markdown_files(base)
local items = {}
local pattern = base .. "/**/*.md"
local files = vim.fn.glob(pattern, false, true)
for _, file in ipairs(files) do
local label = file:gsub("^%./", ""):gsub("%.md$", "")
table.insert(items, { label = label })
end
return items
end
function source:get_keyword_pattern()
return "[%w%./%-]*"
end
function source:complete(params, callback)
local cursor_before_line = params.context.cursor_before_line
local cursor_after_line = params.context.cursor_after_line or ""
if not cursor_before_line:match("%[[^%]]*%]%(") then
callback({})
return
end
local items = get_markdown_files(".")
local next_char = cursor_after_line:sub(1, 1)
for _, item in ipairs(items) do
if next_char == ")" then
item.insertText = item.label
else
item.insertText = item.label .. ")"
end
end
callback(items)
end
function source:get_trigger_characters()
return { "(" }
end
function source:is_available()
local ft = vim.bo.filetype
return ft == "markdown" or ft == "pandoc"
end
cmp.register_source("zk", source)
+25
View File
@@ -0,0 +1,25 @@
require("zk.cmp")
require("zk.utils")
vim.cmd([[
let s:zk_preview_enabled = 0
let s:live_server_job = -1
execute 'au BufEnter' g:zk_path . '/*.md' 'silent exe "!echo %" ">" g:zk_path . "/current-zettel.txt"'
function! ToggleZKPreview()
if s:zk_preview_enabled == 1
let s:zk_preview_enabled = 0
call jobstop(s:live_server_job)
au! ZKPreview
else
let s:zk_preview_enabled = 1
let s:live_server_job = jobstart('live-server --watch=' . g:zk_path . '/current-zettel-content.html --open=current-zettel-content.html --port=8080')
augroup ZKPreview
execute 'au BufEnter' g:zk_path . '/*.md' 'silent exe "!cat %:r.html" ">" g:zk_path . "/current-zettel-content.html"'
execute 'au BufWritePost' g:zk_path . '/*.md' 'silent exe "!make && cat %:r.html" ">" g:zk_path . "/current-zettel-content.html"'
augroup END
endif
endfunction
command! ToggleZKPreview call ToggleZKPreview()
nn <leader>o :ToggleZKPreview<cr> :!xdg-open http://localhost:8080/%:t:r.html & <cr>
]])
@@ -0,0 +1,2 @@
vim.g.zk_path = os.getenv("ZK_PATH") or (os.getenv("HOME") .. "/.zk")
return vim.g.zk_path
@@ -0,0 +1,10 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
};
outputs =
{ self, nixpkgs }:
{
};
}
@@ -0,0 +1,4 @@
{
pkgs ? import <nixpkgs> { },
}:
pkgs.mkShell { nativeBuildInputs = with pkgs.buildPackages; [ ]; }
+27
View File
@@ -0,0 +1,27 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local f = ls.function_node
local TM_FILENAME = function(_, snip)
return snip.env.TM_FILENAME
end
local TM_FILENAME_BASE = function(_, snip)
return snip.env.TM_FILENAME_BASE
end
local NAME = "Hektor Misplon"
local LOCALHOST = "localhost"
local LOCALHOST_IP = "127.0.0.1"
return {
s({ trig = "fn", desc = "Filename" }, { f(TM_FILENAME_BASE) }),
s({ trig = "fne", desc = "Filename (+extension)" }, { f(TM_FILENAME) }),
s({ trig = "hm" }, { t(NAME) }),
s({ trig = "loho" }, { t(LOCALHOST) }),
s({ trig = "lohoi" }, { t(LOCALHOST_IP) }),
s({ trig = "date" }, { f(function()
return os.date("%Y-%m-%d")
end) }),
}
+119
View File
@@ -0,0 +1,119 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
-- Flex
s({ trig = "b1", desc = "Add 'border: 1px <color>;'" }, {
t("border: 1px solid "),
i(1),
t(";"),
i(0),
}),
s({ trig = "dfl", desc = "Add 'display: flex;'" }, {
t("display: flex;"),
i(0),
}),
s({ trig = "flr", desc = "Add 'flex-direction: row;'" }, {
t("flex-direction: row;"),
i(0),
}),
s({ trig = "flc", desc = "Add 'flex-direction: column;'" }, {
t("flex-direction: column;"),
i(0),
}),
s({ trig = "flw", desc = "Add 'flex-wrap: wrap;'" }, {
t("flex-wrap: wrap;"),
i(0),
}),
s({ trig = "dfc", desc = "Add 'flex-direction: column;'" }, {
t("display: flex;"),
t("flex-direction: column;"),
i(0),
}),
-- Grid
s({ trig = "dg", desc = "Add 'display: grid;'" }, {
t("display: grid;"),
i(0),
}),
-- Block
s({ trig = "db", desc = "Add 'display: block;'" }, {
t("display: block;"),
i(0),
}),
-- None
s({ trig = "dn", desc = "Add 'display: none;'" }, {
t("display: none;"),
i(0),
}),
-- CSS Variables
s({ trig = "v", desc = "Add CSS variable" }, {
t("var(--"),
i(1),
t(")"),
i(0),
}),
-- Margin
s({ trig = "m", desc = "Add 'margin: ;'" }, {
t("margin: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "mt", desc = "Add 'margin-top: ;'" }, {
t("margin-top: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "mr", desc = "Add 'margin-right: ;'" }, {
t("margin-right: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "mb", desc = "Add 'margin-bottom: ;'" }, {
t("margin-bottom: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "ml", desc = "Add 'margin-left: ;'" }, {
t("margin-left: "),
i(1),
t(";"),
i(0),
}),
-- Padding
s({ trig = "p", desc = "Add 'padding: ;'" }, {
t("padding: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "pt", desc = "Add 'padding-top: ;'" }, {
t("padding-top: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "pr", desc = "Add 'padding-right: ;'" }, {
t("padding-right: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "pb", desc = "Add 'padding-bottom: ;'" }, {
t("padding-bottom: "),
i(1),
t(";"),
i(0),
}),
s({ trig = "pl", desc = "Add 'padding-left: ;'" }, {
t("padding-left: "),
i(1),
t(";"),
i(0),
}),
}
+67
View File
@@ -0,0 +1,67 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s({ trig = "ifdef" }, {
t("#ifdef GL_ES"),
t("precision mediump float;"),
i(1),
t("#endif"),
}),
s({ trig = "defpi" }, {
t("#define PI 3.14159265359"),
}),
s({ trig = "main" }, {
t("void main() {"),
i(1),
t("}"),
}),
s({ trig = "uni" }, {
t("uniform "),
i(1),
t(";"),
}),
s({ trig = "unif" }, {
t("uniform float "),
i(1),
t(";"),
}),
s({ trig = "univ" }, {
t("uniform vec"),
i(1),
t(" float "),
i(2),
t(";"),
}),
s({ trig = "univ2" }, {
t("uniform vec2 float "),
i(1),
t(";"),
}),
s({ trig = "univ3" }, {
t("uniform vec3 float "),
i(1),
t(";"),
}),
s({ trig = "univ4" }, {
t("uniform vec4 float "),
i(1),
t(";"),
}),
s({ trig = "f" }, {
t("float "),
i(1),
t(";"),
}),
s({ trig = "v" }, {
t("vec"),
}),
s({ trig = "ss" }, {
t("smoothstep("),
i(1),
t(")"),
i(2),
}),
}
@@ -0,0 +1,25 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s({ trig = "clg", desc = "console.log" }, {
t("console.log("),
i(1),
t(")"),
i(0),
}),
s({ trig = "Js", desc = "JSON.stringify" }, {
t("JSON.stringify("),
i(1),
t(")"),
i(0),
}),
s({ trig = "Jsf", desc = "JSON.stringify (formatted)" }, {
t("JSON.stringify("),
i(1),
t(", 0, 2)"),
i(0),
}),
}
+12
View File
@@ -0,0 +1,12 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s({ trig = "^M.", regTrig = true, snippetType = "autosnippet" }, {
t("local M = {"),
i(1),
t({ "}", "", "", "return M" }),
}),
}
+938
View File
@@ -0,0 +1,938 @@
local ls = require("luasnip")
local s = ls.snippet
local i = ls.insert_node
local d = ls.dynamic_node
local sn = ls.snippet_node
local fmta = require("luasnip.extras.fmt").fmta
-- Original .snippets file - TODO: Migrate to lua snippets
-- ```viml
-- global !p
-- from datetime import datetime
-- from math import factorial
-- import subprocess
-- import re
-- import sys
--
-- ZOTERO_BASE = "http://127.0.0.1:23119/better-bibtex/cayw"
-- FENCES = {
-- "i": "idea",
-- "q": "question",
-- "n": "note",
-- "t": "thought",
-- }
--
-- def math_inline():
-- return vim.command_output('GetContext') == 'math_inline'
--
-- def math_block():
-- return vim.command_output('GetContext') == 'math_block'
--
-- def math():
-- return math_inline() or math_block()
--
-- def code_block():
-- return vim.command_output('GetContext') == 'pandocDelimitedCodeBlock'
--
-- def code_inline():
-- return vim.command_output('GetContext') == 'pandocNoFormatted'
--
-- def code():
-- return code_inline() or code_block()
--
-- def slugify(text):
-- return re.sub('\s+', '-', text.lower())
--
-- def linkify(text, link):
-- return f"[{text}]({link})"
--
-- def zot(action):
-- if action == "get_title":
-- cmd = f"curl -s '{ZOTERO_BASE}?format=json&selected=1' | jq '.[].title' -r"
-- elif action == "get_citekey":
-- cmd = f"curl -s '{ZOTERO_BASE}?format=pandoc&selected=1'"
-- elif action == "get_citekey_brackets":
-- cmd = f"curl -s '{ZOTERO_BASE}?format=pandoc&selected=1&brackets=1'"
-- elif action == "get_link":
-- link_path = re.sub("^@", "", zot("get_citekey"))
-- link_title = zot("get_title")
-- link = linkify(link_title, link_path)
-- return link
-- elif action == "get_file":
-- link_path = re.sub("^@", "", zot("get_citekey"))
-- link_title = zot("get_title")
-- link = linkify(link_title, f"file://{link_path}.pdf")
-- return link
-- else:
-- return "Zotero action not found"
-- return subprocess.check_output(cmd, shell=True).decode("utf-8").strip()
-- endglobal
--
-- snippet ctx "Context" i
-- `!p snip.rv = vim.command_output('GetContext')`
-- endsnippet
--
-- # General markdown
--
-- snippet ^h "Markdown header" r
-- # $1
-- endsnippet
--
-- snippet ^sec "Markdown section" r
-- ## $1
-- endsnippet
--
-- snippet ^ssec "Markdown subsection" r
-- ### $1
-- endsnippet
--
-- snippet ^sex "Markdown example section" r
-- ## Example: $1
-- endsnippet
--
-- snippet ^ssex "Markdown example subsection" r
-- ### Example: $1
-- endsnippet
--
-- # Zettelkasten templating
--
-- snippet nl
-- *nld*: $1
-- endsnippet
--
-- snippet eng
-- *eng*: $1
-- endsnippet
--
-- snippet fr
-- *fra*: $1
-- endsnippet
--
-- snippet (de
-- *deu*: $1
-- endsnippet
--
-- snippet (nl
-- (*nld*: $1)
-- endsnippet
--
-- snippet (eng
-- (*eng*: $1)
-- endsnippet
--
-- snippet (fr
-- (*fra*: $1)
-- endsnippet
--
-- snippet (de
-- (*deu*: $1)
-- endsnippet
--
-- snippet in
-- (In [$1]($2))$3
-- endsnippet
--
-- snippet liwhat "What?" A
-- `!p snip.rv = "* [What?](" + snip.basename + "_what)"`$1
-- endsnippet
--
-- snippet liwhy "Why?" A
-- `!p snip.rv = "* [Why?](" + snip.basename + "_why)"`$1
-- endsnippet
--
-- snippet < "Comment (html)"
-- <!-- $1 -->$2
-- endsnippet
--
-- snippet <. "Comment (html) ..." i
-- <!-- ... -->$1
-- endsnippet
--
-- snippet <t "Thought (html)" i
-- <!--:::thought
-- $1
-- :::-->
-- endsnippet
--
-- snippet <q "Question (html)" i
-- <!--:::question
-- $1
-- :::-->
-- endsnippet
--
-- snippet <i "Idea (html)" i
-- <!--:::idea
-- $1
-- :::-->
-- endsnippet
--
-- snippet <n "Note (html)" i
-- <!--:::note
-- $1
-- :::-->
-- endsnippet
--
-- snippet td "Todo"
-- TODO${1:: $2}
-- endsnippet
--
-- snippet ref "References"
-- <!--references-->
-- endsnippet
--
-- snippet sort "Sort"
-- <!--sort-->
-- endsnippet
--
-- snippet foot "Footnotes"
-- <!--footnotes-->
-- [^0]:
-- endsnippet
--
-- snippet def "Definition"
-- **Definition${1:: $2}**${3: [${4:citation}${5:, ${6:pointer}}]}
--
-- $7
--
-- ___
-- endsnippet
--
-- snippet theo "Theorem"
-- **Theorem${1:: $2}**${3: [${4:citation}${5:, ${6:pointer}}]}
--
-- $7
--
-- ${8/(\w+).*/**Theorem** \n\n.../}
--
-- ___
-- endsnippet
--
-- snippet prop "Property"
-- **Property $1** [@]
--
-- $2
--
-- ___
-- endsnippet
--
-- snippet lemm "Lemma"
-- **Lemma $1** [@]
--
-- $2
--
-- ___
-- endsnippet
--
-- snippet coro "Corollary"
-- **Corollary $1** [@]
--
-- $2
--
-- ___
-- endsnippet
--
-- # Greek symbols
--
-- context "math()"
-- snippet alpha "Alpha"
-- \\alpha
-- endsnippet
--
-- context "math()"
-- snippet beta "Beta"
-- \\beta
-- endsnippet
--
-- context "math()"
-- snippet gamma "Gamma"
-- \\gamma
-- endsnippet
--
-- context "math()"
-- snippet delta "Delta"
-- \\delta
-- endsnippet
--
-- context "math()"
-- snippet epsilon "Epsilon"
-- \\epsilonilon
-- endsnippet
--
-- context "math()"
-- snippet zeta "Zeta"
-- \\zeta
-- endsnippet
--
-- context "math()"
-- snippet eta "Eta"
-- \\eta
-- endsnippet
--
-- context "math()"
-- snippet theta "Theta"
-- \\theta
-- endsnippet
--
-- context "math()"
-- snippet iota "Iota"
-- \\iota
-- endsnippet
--
-- context "math()"
-- snippet kappa "Kappa"
-- \\kappa
-- endsnippet
--
-- context "math()"
-- snippet lambda "Lambda" i
-- \\lambda
-- endsnippet
--
-- context "math()"
-- snippet mu "Mu"
-- \\mu
-- endsnippet
--
-- context "math()"
-- snippet nu "Nu"
-- \\nu
-- endsnippet
--
-- context "math()"
-- snippet xi "Xi"
-- \\xi
-- endsnippet
--
-- context "math()"
-- snippet omicron "Omicron"
-- \\omicron
-- endsnippet
--
-- context "math()"
-- snippet pi "Pi"
-- \\pi
-- endsnippet
--
-- context "math()"
-- snippet rho "Rho"
-- \\rho
-- endsnippet
--
-- context "math()"
-- snippet sigma "Sigma"
-- \\sigma
-- endsnippet
--
-- context "math()"
-- snippet tau "Tau"
-- \\tau
-- endsnippet
--
-- context "math()"
-- snippet upsilon "Upsilon"
-- \\upsilon
-- endsnippet
--
-- context "math()"
-- snippet phi "Phi"
-- \\phi
-- endsnippet
--
-- context "math()"
-- snippet chi "Chi"
-- \\chi
-- endsnippet
--
-- context "math()"
-- snippet psi "Psi"
-- \\psi
-- endsnippet
--
-- context "math()"
-- snippet omega "Omega"
-- \\omega
-- endsnippet
--
-- context "math()"
-- snippet Gamma "Gamma"
-- \\Gamma
-- endsnippet
--
-- context "math()"
-- snippet Delta "Delta"
-- \\Delta
-- endsnippet
--
-- context "math()"
-- snippet Theta "Theta"
-- \\Theta
-- endsnippet
--
-- context "math()"
-- snippet Lambda "Lambda"
-- \\Lambda
-- endsnippet
--
-- context "math()"
-- snippet Xi "Xi"
-- \\Xi
-- endsnippet
--
-- context "math()"
-- snippet Pi "Pi"
-- \\Pi
-- endsnippet
--
-- context "math()"
-- snippet Sigma "Sigma"
-- \\Sigma
-- endsnippet
--
-- context "math()"
-- snippet Upsilon "Upsilon"
-- \\Upsilon
-- endsnippet
--
-- context "math()"
-- snippet Phi "Phi"
-- \\Phi
-- endsnippet
--
-- context "math()"
-- snippet Psi "Psi"
-- \\Psi
-- endsnippet
--
-- context "math()"
-- snippet Omega "Omega"
-- \\Omega
-- endsnippet
--
-- snippet asaw "Als en slechts als (woorden)" i
-- als en slechts als
-- endsnippet
--
-- snippet iffw "If and only if (words)" i
-- if and only if
-- endsnippet
--
-- snippet asas "Als en slechts als (shorthand)" i
-- **asa**
-- endsnippet
--
-- snippet iffs "If and only if (shorthand)" i
-- **iff**
-- endsnippet
--
-- snippet beg "Begin"
-- \begin{$1}
-- $2
-- \end{$1}
-- endsnippet
--
-- snippet align "" i
-- \begin{align}
-- $1
-- \end{align}
-- endsnippet
--
-- snippet cases "" i
-- \begin{cases}
-- $1 \\\\
-- $2
-- \end{cases}
-- $3
-- endsnippet
--
-- snippet tik "Tikzpicture" i
-- \begin{tikzpicture}
-- $1
-- \end{tikzpicture}
-- endsnippet
--
-- snippet matrix "Matrix" i
-- \begin{bmatrix}
-- $1
-- \end{bmatrix}
-- endsnippet
--
-- # Insert anything after m/M in math mode
--
-- snippet "(\b)m(.*)" "MathJax" r
-- `!p snip.rv = match.group(1) + "$" + match.group(2) + "$"`
-- endsnippet
--
-- snippet (\b)M(.*) "MathJax block" irw
-- $$
-- `!p snip.rv = match.group(2)`
-- $$
-- endsnippet
--
-- # Calligraphic letters
--
-- context "math()"
-- snippet c([A-z]) "Calligraphic A" r
-- `!p snip.rv = "\\mathcal{" + match.group(1) + "}"`$1
-- endsnippet
--
-- # Subscripts
--
-- context "math()"
-- snippet '([A-z])(\w+)' "Subscripts" irw
-- `!p snip.rv = match.group(1) + '_' + match.group(2) if len(match.group(2)) == 1 else match.group(1) + '_{' + match.group(2) + '}'`$1
-- endsnippet
--
-- # MathJax
--
-- snippet fa "For all" i
-- \forall
-- endsnippet
--
-- snippet frac "" i
-- \frac{$1}{$2}$3
-- endsnippet
--
-- snippet set "" i
-- \\{$1\\}$2
-- endsnippet
--
-- snippet N "" i
-- \mathbb{N}
-- endsnippet
--
-- snippet N0 "" i
-- \mathbb{N}_0
-- endsnippet
--
-- snippet N+ "" i
-- \mathbb{N}^+
-- endsnippet
--
-- snippet Z "" i
-- \mathbb{Z}
-- endsnippet
--
-- snippet Z0 "" i
-- \mathbb{Z}_0
-- endsnippet
--
-- snippet Z+ "" i
-- \mathbb{Z}^+
-- endsnippet
--
-- snippet R "" i
-- \mathbb{R}
-- endsnippet
--
-- snippet R0 "" i
-- \mathbb{R}_0
-- endsnippet
--
-- snippet R+ "" i
-- \mathbb{R}^+
-- endsnippet
--
-- snippet C "" i
-- \mathbb{C}
-- endsnippet
--
-- snippet lim "" i
-- \lim_{$1}$2
-- endsnippet
--
-- snippet limn "" i
-- \lim_{n \to \infty}$2
-- endsnippet
--
-- snippet binom "" i
-- \binom{$1}{$2}$3
-- endsnippet
--
-- snippet andmath "description" i
-- \text{ and }
-- endsnippet
--
-- snippet enmath "description" i
-- \text{ en }
-- endsnippet
--
-- snippet lra "MathJax: long right arrow" i
-- \longrightarrow
-- endsnippet
--
-- snippet Ra "MathJax: right arrow" i
-- \Rightarrow
-- endsnippet
--
-- snippet Im "MathJax: image operator" i
-- \operatorname{Im}
-- endsnippet
--
-- snippet ggd "Grootste gemene deler" i
-- \operatorname{ggd}
-- endsnippet
--
-- snippet fl "Floating point" i
-- \operatorname{fl}
-- endsnippet
--
-- snippet Var "Variance" i
-- \operatorname{Var}
-- endsnippet
--
-- snippet E "Expectation" i
-- \operatorname{E}
-- endsnippet
--
-- snippet Cov "Covariance" i
-- \operatorname{Cov}
-- endsnippet
--
-- context "math()" i
-- snippet ntup "Alpha"
-- (x_1, \ldots, x_n)
-- endsnippet
--
-- snippet mxn "Matrix" i
-- m \times n
-- endsnippet
--
-- snippet mxn- "Matrix" i
-- $m \times n$-matrix
-- endsnippet
--
-- snippet nxn "Matrix" i
-- n \times n
-- endsnippet
--
-- snippet det "Determinant" i
-- \operatorname{det}(${1:A})$2
-- endsnippet
--
-- snippet det| "Determinant alternative notation" i
-- |${1:A}|$2
-- endsnippet
--
-- snippet Span "Span" i
-- \operatorname{Span}\\{$1\\}$2
-- endsnippet
--
-- snippet Nul "Null" i
-- \operatorname{Nul}($1)$2
-- endsnippet
--
-- snippet Col "Column space" i
-- \operatorname{Col}($1)$2
-- endsnippet
--
-- snippet kern "Kernel" i
-- \operatorname{kern}($1)$2
-- endsnippet
--
-- context "math()"
-- snippet vec "Vector" i
-- \mathbf{$1}$2
-- endsnippet
--
-- context "math()"
-- snippet vec([A-z]) "Vector ..." r
-- `!p snip.rv = "\\mathbf{" + match.group(1) + "}"`$1
-- endsnippet
--
-- snippet v1tovp "Vectors v indexed from 1 to p"
-- \mathbf{v_1},...,\mathbf{v_p}$2
-- endsnippet
--
-- snippet a1toan "Vectors a indexed from 1 to n"
-- \mathbf{a_1},...,\mathbf{v_n}$2
-- endsnippet
--
-- snippet .. "Dot dot dot" i
-- \dots $1
-- endsnippet
--
-- snippet text "MathJax text" i
-- \text{$1}$2
-- endsnippet
--
-- snippet leq "Less than or equal to" i
-- \leq
-- endsnippet
--
-- snippet leq "Greater than or equal to" i
-- \geq
-- endsnippet
--
-- snippet eat "Evaluated at" i
-- {\biggr\rvert}_{$1}$2
-- endsnippet
--
-- snippet sketch "Link a sketch" i
-- [$1](file:///home/h/sketches/$2)
-- endsnippet
--
-- snippet deck "Get anki deck"
-- `get-anki-decks`
-- endsnippet
--
-- # snippet ` "Inline code" i
-- # `$1`
-- # endsnippet
--
-- # Escape backticks
-- snippet `` "Code block" bA
-- \`\`\`$1
-- $2
-- \`\`\`
-- endsnippet
--
-- snippet `tex "Latex block (see latex filter)" bA
-- \`\`\`{.tex}
-- $1
-- \`\`\`
-- endsnippet
--
-- snippet `tik "Tikz block (see tikz filter)" bA
-- \`\`\`{.tex}
-- \\begin{tikzpicture}
-- $1
-- \\end{tikzpicture}
-- \`\`\`
-- endsnippet
--
-- snippet "(\b)fn(\d+)" "" ir
-- `!p snip.rv = snip.basename + "_" + match.group(2).zfill(2)`$1
-- endsnippet
--
-- snippet "ch(\d+)" "Link chapter" ir
-- `!p
-- num_str = match.group(1).zfill(2)
-- title = 3*"."
-- link = snip.basename + "_" + num_str
-- snip.rv = num_str + ". " + linkify(title, link)
-- `
-- endsnippet
--
-- snippet "ch(\d+)to(\d+)" "Link chapters ... to ..." irA
-- `!p
-- for i in range(int(match.group(1)), int(match.group(2)) + 1):
-- num_str = str(i).zfill(2)
-- title = 3*"."
-- link = snip.basename + "_" + num_str
-- snip.rv += num_str + ". " + linkify(title, link) + "\n"
-- `
-- endsnippet
--
-- snippet "sec([\sA-z]+)" "Link section titled ..." r
-- `!p
-- snip.rv = "* " + linkify(match.group(1), f"{snip.basename}_{slugify(match.group(1))}")
-- `
-- endsnippet
--
-- snippet cp(\d+) "Comment current page (and date)" r
-- `!p snip.rv = "<!--" + datetime.now().strftime("%Y-%m-%d") + " p. " + match.group(1) + "-->"`
-- endsnippet
--
-- snippet (\d+)! "Factorial of ..." r
-- `!p snip.rv = factorial(int(match.group(1)))`
-- endsnippet
--
-- snippet d "Date"
-- `!p snip.rv = datetime.now().strftime("%Y-%m-%d")`
-- endsnippet
--
-- snippet :(\w*) "Fence" r
-- `!p snip.rv += ":::" + FENCES.get(match.group(1) or "", "") + "\n" `$1
-- `!p snip.rv += ":::"`$2
-- endsnippet
--
-- snippet \[(\w*) "Fence inline" ir
-- `!p snip.rv += "["`$1`!p snip.rv += "]{." + FENCES.get(match.group(1) or "", "") + "}"`$2
-- endsnippet
--
-- snippet ^eg "Example" r
-- E.g. $1
-- endsnippet
--
-- # E.g. after list (or list preceded by space)
-- snippet (\*\s|\*)eg "Example" r
-- * E.g. $1
-- endsnippet
--
-- # E.g. after dot (or dot preceded by space)
-- snippet (\.\s|\.)eg "Example" r
-- . E.g. $1
-- endsnippet
--
-- snippet (?<!^|\*\s|\*|\.\s|\.)eg "Example" r
-- e.g. $1
-- endsnippet
--
-- # Zettelkasten to Anki
--
-- snippet td "TARGET DECK: <Deck name>"
-- TARGET DECK: $1::$2
-- endsnippet
--
-- snippet clo "Cloze"
-- START
-- Cloze
-- ${0:${VISUAL}}$1
-- END
-- $2
-- endsnippet
--
-- snippet clos "Cloze start"
-- START
-- Cloze
-- $1
-- endsnippet
--
-- snippet cloe "Cloze end"
-- END
-- endsnippet
--
-- snippet clod
-- START
-- Cloze
-- **Definition$1**
--
-- $2
-- END
-- endsnippet
--
-- snippet clop
-- START
-- Cloze
-- **Property$1**
--
-- $2
-- END
-- endsnippet
--
-- snippet clot
-- START
-- Cloze
-- **Theorem$1**
--
-- $2
-- END
-- endsnippet
--
-- snippet clol
-- START
-- Cloze
-- **Lemma$1**
--
-- $2
-- END
-- endsnippet
--
-- snippet "c(\d+)" "Cloze <number>" r
-- {{c`!p snip.rv = int(match.group(1))`::${0:${VISUAL}}$1}}$2
-- endsnippet
--
-- # Match preceded by whitespace or start of line
-- snippet (?<!\S)z($|t|l|z|o|\.) "Zotero" r
-- `!p
--
-- ACTIONS = {
-- "": "get_citekey",
-- "t": "get_title",
-- "l": "get_link",
-- "z": "get_citekey_brackets",
-- "o": "get_file",
-- }
--
-- snip.rv = zot(ACTIONS.get(match.group(1)))
-- `
-- endsnippet
--
-- snippet zq "Zotero quote" r
-- `!p snip.rv = '>\n> --' + zot("get_citekey_brackets")`
-- endsnippet
--
-- snippet acz "According to ..."
-- `!p snip.rv = "According to " + zot("get_citekey")`
-- endsnippet
--
-- snippet azex "As ... explains"
-- `!p snip.rv = "As " + zot("get_citekey") + " explains, "`
-- endsnippet
--
-- snippet iz "In ..."
-- `!p snip.rv = "In " + zot("get_citekey")`
-- endsnippet
--
-- snippet izd "In ...'s definition"
-- `!p snip.rv = "In " + zot("get_citekey") + "'s definition, "`
-- endsnippet
--
-- snippet zintends "... intends to ..." A
-- `!p snip.rv = zot("get_citekey") + " intends to "`
-- endsnippet
--
-- snippet tfol "The following" wA
-- the following
-- endsnippet
--
-- snippet tfolt "It follows that" wA
-- it follows that
-- endsnippet
--
-- snippet ntfol "In the following" wA
-- in the following
-- endsnippet
--
-- snippet algos "algorithms" wA
-- algorithms
-- endsnippet
--
-- snippet algo "algorithm" wA
-- algorithm
-- endsnippet
--
-- # TODO: Make only available in tikzpicture
-- context "code()"
-- snippet q "State" w
-- \node[state] ($1) [] {$2};
-- endsnippet
--
-- context "code()"
-- snippet q0 "Initial state" w
-- \node[initial,state] ($1) {$2};
-- endsnippet
-- ```
-- Taken from https://ejmastnak.com/tutorials/vim-latex/luasnip/#anatomy
local get_visual = function(_, parent)
if #parent.snippet.env.LS_SELECT_RAW > 0 then
return sn(nil, i(1, parent.snippet.env.LS_SELECT_RAW))
else
return sn(nil, i(1))
end
end
return {
s(
{ trig = "^h", regTrig = true, desc = "Markdown header" },
fmta("# <><>", {
d(1, get_visual),
i(0),
})
),
s(
{ trig = "^sec", regTrig = true, desc = "Markdown header" },
fmta("## <><>", {
d(1, get_visual),
i(0),
})
),
s(
{ trig = "^ssec", regTrig = true, desc = "Markdown header" },
fmta("### <><>", {
d(1, get_visual),
i(0),
})
),
}
+24
View File
@@ -0,0 +1,24 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s("reqtrace", t({ "(#%require racket/trace)" })),
s("strln", t({ "(string-length " }), i(1), t({ ")" })),
s("impb", t({ "(import (rnrs base (6))", " (rnrs io simple" }), i(0), t({ ")" })),
s("def", {
t("(define "),
i(1),
t(" "),
i(2),
t(")"),
}),
s("defp", {
t("(define ("),
i(1),
t(" "),
i(2),
t("))"),
}),
}
@@ -0,0 +1,15 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s("host", {
t("Host "),
i(1, "alias"),
t({ "", "\tHostName " }),
i(2, "name"),
t({ "", "\tUser " }),
i(3, "user"),
}),
}
+30
View File
@@ -0,0 +1,30 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
-- TODO: extends html, javascript, css
return {
s("oM", {
t({ "onMount(() => {" }),
i(0),
t({ "})" }),
}),
s("oD", {
t({ "onDestroy(() => {" }),
i(0),
t({ "})" }),
}),
s("preJsf", {
t({ "<pre>" }),
i(0),
t({ "{JSON.stringify($0, 0, 2)}" }),
t({ "</pre>" }),
}),
s(":g", {
t({ ":global(" }),
i(0),
t({ ")" }),
}),
}
+69
View File
@@ -0,0 +1,69 @@
local ls = require("luasnip")
local s = ls.snippet
local i = ls.insert_node
local t = ls.text_node
local f = ls.function_node
-- Inspired by https://castel.dev/post/lecture-notes-1/
ls.add_snippets("tex", {
s("beg", {
t("\\begin{"),
i(1),
t({ "}", "\t" }),
i(0),
t({ "", "\\end{" }),
f(function(args)
return args[1][1]
end, { 1 }),
t("}"),
}),
s("def", {
t("\\begin{definition}"),
t({ "", "\t" }),
i(0),
t({ "", "\\end{definition}" }),
}),
s("fig", {
t("\\begin{figure}"),
t({ "", "\t" }),
i(0),
t({ "", "\\end{figure}" }),
}),
s(
"time",
f(function()
return os.date("%H:%M")
end)
),
s("i", t("\\textit{"), i(0), t("}")),
s("b", t("\\textbf{"), i(0), t("}")),
s("center", {
t("\\begin{center}"),
t({ "", "" }),
i(0),
t({ "", "\\end{center}" }),
}),
s("pac", t("\\usepackage{"), i(0), t("}")),
s("foot", t("\\footnote{"), i(0), t("}")),
s("dm", {
t({ "\\[", "" }),
i(1),
t({ "", "\\]" }),
i(0),
}),
s("ch", t("\\chapter{"), i(0), t("}")),
s("sec", t("\\section{"), i(0), t("}")),
s("ssec", t("\\subsection{"), i(0), t("}")),
s("sssec", t("\\subsubsection{"), i(0), t("}")),
})
@@ -0,0 +1,12 @@
local ls = require("luasnip")
local s = ls.snippet
local t = ls.text_node
local i = ls.insert_node
return {
s("preJ", {
t("<pre>{JSON.stringify("),
i(1, "object"), -- first tab stop
t(", null, 2)}</pre>"),
}),
}
+2
View File
@@ -0,0 +1,2 @@
indent_type = "Spaces"
indent_width = 2
+4
View File
@@ -0,0 +1,4 @@
pkgs: {
vscode = [ pkgs.vimPlugins.vscode-nvim ];
zenwritten = [ pkgs.vimPlugins.zenbones-nvim ];
}
+9
View File
@@ -0,0 +1,9 @@
local map = vim.keymap.set
require("keymaps")
map({ "n", "v" }, "<leader>p", '<cmd>call VSCodeNotify("workbench.action.quickOpen")<cr>')
map({ "n", "v" }, "<leader>f", '<cmd>call VSCodeNotify("workbench.action.findInFiles")<cr>')
map({ "n", "v" }, "<leader>b", '<cmd>call VSCodeNotify("workbench.action.toggleSidebarVisibility")<cr>')
map({ "n", "v" }, "<leader>t", '<cmd>call VSCodeNotify("workbench.action.togglePanel")<cr>')
map({ "n", "v" }, "<leader>ca", "<cmd>call VSCodeNotify('editor.action.quickFix')<cr>")