mirror of
https://github.com/donovanglover/nix-config.git
synced 2024-11-22 00:03:55 +01:00
522ea1201d
This is a part of having separate flake.nix files for each project and using devShells for the dependencies needed. Note that using Crystal as a language seems less likely overall due to the difficulty of building Crystal packages for nixpkgs and the lack of tooling and library support compared to other languages like TypeScript and Rust.
538 lines
15 KiB
Nix
538 lines
15 KiB
Nix
{ pkgs, config, ... }:
|
|
|
|
let
|
|
inherit (config.lib.stylix.scheme) slug;
|
|
|
|
base16-nvim = pkgs.vimUtils.buildVimPlugin {
|
|
pname = "base16-nvim";
|
|
version = "2024-02-17";
|
|
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "RRethy";
|
|
repo = "base16-nvim";
|
|
rev = "b3e9ec6a82c05b562cd71f40fe8964438a9ba64a";
|
|
hash = "sha256-l0BO2boIy6mwK8ISWS3D68f8egqHYwsGSAnzjbB5aOE=";
|
|
};
|
|
};
|
|
in
|
|
{
|
|
programs.bat.enable = true;
|
|
|
|
home.packages = with pkgs; [
|
|
nixpkgs-fmt
|
|
nixfmt-rfc-style
|
|
|
|
nodejs
|
|
yarn
|
|
deno
|
|
bun
|
|
nodePackages.pnpm
|
|
pnpm-shell-completion
|
|
|
|
rustc
|
|
rustfmt
|
|
cargo
|
|
cargo-info
|
|
cargo-license
|
|
cargo-feature
|
|
cargo-tarpaulin
|
|
cargo-edit
|
|
bacon
|
|
clippy
|
|
|
|
texlive.combined.scheme-full
|
|
tectonic
|
|
typst
|
|
typstfmt
|
|
typst-live
|
|
|
|
universal-ctags
|
|
|
|
sqlite
|
|
sqlcipher
|
|
litecli
|
|
];
|
|
|
|
editorconfig = {
|
|
enable = true;
|
|
|
|
settings = {
|
|
"*" = {
|
|
charset = "utf-8";
|
|
end_of_line = "lf";
|
|
insert_final_newline = true;
|
|
indent_size = 2;
|
|
indent_style = "space";
|
|
trim_trailing_whitespace = false;
|
|
};
|
|
|
|
"Makefile" = {
|
|
indent_style = "tab";
|
|
indent_size = 4;
|
|
};
|
|
|
|
"*.html" = {
|
|
indent_style = "tab";
|
|
indent_size = 4;
|
|
};
|
|
|
|
"*.rs" = {
|
|
indent_style = "space";
|
|
indent_size = 4;
|
|
};
|
|
};
|
|
};
|
|
|
|
programs.neovim = {
|
|
enable = true;
|
|
defaultEditor = true;
|
|
|
|
extraPackages = with pkgs; [
|
|
nodePackages.vls
|
|
nodePackages.typescript-language-server
|
|
nodePackages."@astrojs/language-server"
|
|
nodePackages."@prisma/language-server"
|
|
lua-language-server
|
|
emmet-language-server
|
|
crystalline
|
|
marksman
|
|
tailwindcss-language-server
|
|
vscode-langservers-extracted
|
|
rust-analyzer
|
|
texlab
|
|
typst-lsp
|
|
nil
|
|
];
|
|
|
|
extraConfig = /* vim */ ''
|
|
filetype plugin indent on
|
|
set undofile
|
|
set spell
|
|
set number
|
|
set linebreak
|
|
set clipboard=unnamedplus
|
|
set fileencoding=utf-8 " Ensure that we always save files as utf-8
|
|
set fileencodings=utf-8,sjis " Automatically open shiftjis files with their proper encoding
|
|
set spelllang=en_us,cjk " Don't show errors for CJK characters
|
|
set noshowmode " Disable the --MODE-- text (enable if not using the status line)
|
|
set mouse=a
|
|
set ignorecase " By default use case-insensitive search (combine with smartcase)
|
|
set smartcase " Make search case-sensitive when using capital letters
|
|
set scrolloff=1 " The minimal number of rows to show when scrolling up/down
|
|
set sidescrolloff=5 " The minimal number of columns to show when scrolling left/right
|
|
set tabstop=4 " Show a tab character as 4 spaces
|
|
set softtabstop=0 " Edit soft tabs as if they're regular spaces
|
|
set shiftwidth=4 " Make autoindent appear as 4 spaces
|
|
|
|
set foldmethod=indent
|
|
set foldlevelstart=99
|
|
|
|
map <MiddleMouse> <Nop>
|
|
imap <MiddleMouse> <Nop>
|
|
map <2-MiddleMouse> <Nop>
|
|
imap <2-MiddleMouse> <Nop>
|
|
map <3-MiddleMouse> <Nop>
|
|
imap <3-MiddleMouse> <Nop>
|
|
map <4-MiddleMouse> <Nop>
|
|
imap <4-MiddleMouse> <Nop>
|
|
|
|
highlight Search ctermbg=240 ctermfg=255
|
|
highlight IncSearch ctermbg=255 ctermfg=240
|
|
|
|
let mapleader = ' '
|
|
nnoremap <silent> <leader>e :set nu!<CR>
|
|
nnoremap <silent> <leader>o :GitBlameToggle<CR>
|
|
nnoremap <silent> <leader>a :NvimTreeFocus<CR>
|
|
nnoremap <silent> <leader>d :bp\|bd #<CR>
|
|
nnoremap <silent> <leader>f :Files<CR>
|
|
nnoremap <silent> <leader>g :set hlsearch!<CR>
|
|
nnoremap <silent> <leader>j :Buffers<CR>
|
|
nnoremap <silent> <leader>l :Rg<CR>
|
|
nnoremap <silent> <leader>; :NvimTreeToggle<CR>
|
|
nnoremap <silent> <leader>b :Vista!!<CR>
|
|
vnoremap <C-s> y:silent !notify-send -t 4000 "成果" "$(tango '<C-r>0')"<CR>:<Esc>
|
|
|
|
autocmd BufNewFile,BufRead *.ecr setlocal syntax=html
|
|
autocmd BufWritePre,FileWritePre * silent! call mkdir(expand('<afile>:p:h'), 'p')
|
|
autocmd VimEnter * silent! :cd `git rev-parse --show-toplevel`
|
|
|
|
tnoremap <C-space> <C-\><C-n>
|
|
'';
|
|
|
|
plugins = with pkgs.vimPlugins; [
|
|
{
|
|
plugin = nvim-tree-lua;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require("nvim-tree").setup()
|
|
|
|
vim.api.nvim_create_autocmd({"QuitPre"}, {
|
|
callback = function()
|
|
vim.cmd("NvimTreeClose")
|
|
end
|
|
})
|
|
|
|
local function open_nvim_tree(data)
|
|
local real_file = vim.fn.filereadable(data.file) == 1
|
|
local no_name = data.file == "" and vim.bo[data.buf].buftype == ""
|
|
|
|
if not real_file and not no_name then
|
|
return
|
|
end
|
|
|
|
require("nvim-tree.api").tree.toggle({ focus = false, find_file = true })
|
|
end
|
|
|
|
vim.api.nvim_create_autocmd({ "VimEnter" }, { callback = open_nvim_tree })
|
|
'';
|
|
}
|
|
{
|
|
plugin = indent-blankline-nvim;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require("ibl").setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = gitsigns-nvim;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require('gitsigns').setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-web-devicons;
|
|
type = "lua";
|
|
}
|
|
{
|
|
plugin = nvim-scrollbar;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require("scrollbar").setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-lspconfig;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
local lspconfig = require('lspconfig')
|
|
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
|
|
|
lspconfig.denols.setup {
|
|
capabilities = capabilities,
|
|
root_dir = lspconfig.util.root_pattern("deno.json", "deno.jsonc"),
|
|
}
|
|
|
|
lspconfig.tsserver.setup {
|
|
capabilities = capabilities,
|
|
root_dir = lspconfig.util.root_pattern("package.json"),
|
|
single_file_support = false
|
|
}
|
|
|
|
lspconfig.typst_lsp.setup {
|
|
capabilities = capabilities,
|
|
settings = {
|
|
exportPdf = "onSave"
|
|
}
|
|
}
|
|
|
|
lspconfig.eslint.setup {
|
|
capabilities = capabilities,
|
|
on_attach = function(client, bufnr)
|
|
vim.api.nvim_create_autocmd("BufWritePre", {
|
|
buffer = bufnr,
|
|
command = "EslintFixAll",
|
|
})
|
|
end
|
|
}
|
|
|
|
lspconfig.tailwindcss.setup {
|
|
capabilities = capabilities,
|
|
on_attach = function(client, bufnr)
|
|
require("tailwindcss-colors").buf_attach(bufnr)
|
|
end
|
|
}
|
|
|
|
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float)
|
|
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
|
|
vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
|
|
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist)
|
|
|
|
vim.api.nvim_create_autocmd('LspAttach', {
|
|
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
|
|
|
|
callback = function(ev)
|
|
local opts = { buffer = ev.buf }
|
|
|
|
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
|
|
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
|
|
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
|
|
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
|
|
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
|
|
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts)
|
|
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts)
|
|
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
|
|
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
|
|
end,
|
|
})
|
|
|
|
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(
|
|
vim.lsp.handlers.hover, { border = "single" }
|
|
)
|
|
|
|
vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(
|
|
vim.lsp.handlers.signature_help, { border = "single" }
|
|
)
|
|
|
|
vim.diagnostic.config {
|
|
float = { border = "single" }
|
|
}
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-cmp;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
|
local lspconfig = require('lspconfig')
|
|
|
|
local servers = {
|
|
'nil_ls',
|
|
'rust_analyzer',
|
|
'marksman',
|
|
'lua_ls',
|
|
'html',
|
|
'clangd',
|
|
'texlab',
|
|
'crystalline',
|
|
'prismals',
|
|
'jsonls',
|
|
'vuels',
|
|
'sqlls',
|
|
'emmet_language_server',
|
|
'astro',
|
|
'cssls',
|
|
}
|
|
|
|
for _, lsp in ipairs(servers) do
|
|
lspconfig[lsp].setup {
|
|
capabilities = capabilities,
|
|
}
|
|
end
|
|
|
|
local luasnip = require('luasnip')
|
|
local cmp = require('cmp')
|
|
|
|
cmp.setup {
|
|
snippet = {
|
|
expand = function(args)
|
|
luasnip.lsp_expand(args.body)
|
|
end,
|
|
},
|
|
mapping = cmp.mapping.preset.insert({
|
|
['<C-u>'] = cmp.mapping.scroll_docs(-4),
|
|
['<C-d>'] = cmp.mapping.scroll_docs(4),
|
|
['<C-Space>'] = cmp.mapping.complete(),
|
|
['<CR>'] = cmp.mapping.confirm {
|
|
behavior = cmp.ConfirmBehavior.Replace,
|
|
select = true,
|
|
},
|
|
['<Tab>'] = cmp.mapping(function(fallback)
|
|
if cmp.visible() then
|
|
cmp.select_next_item()
|
|
elseif luasnip.expand_or_jumpable() then
|
|
luasnip.expand_or_jump()
|
|
else
|
|
fallback()
|
|
end
|
|
end, { 'i', 's' }),
|
|
['<S-Tab>'] = cmp.mapping(function(fallback)
|
|
if cmp.visible() then
|
|
cmp.select_prev_item()
|
|
elseif luasnip.jumpable(-1) then
|
|
luasnip.jump(-1)
|
|
else
|
|
fallback()
|
|
end
|
|
end, { 'i', 's' }),
|
|
}),
|
|
sources = {
|
|
{ name = 'nvim_lsp' },
|
|
{ name = 'luasnip' },
|
|
},
|
|
}
|
|
'';
|
|
}
|
|
cmp-nvim-lsp
|
|
cmp_luasnip
|
|
{
|
|
plugin = luasnip;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require("luasnip.loaders.from_vscode").lazy_load()
|
|
'';
|
|
}
|
|
friendly-snippets
|
|
{
|
|
plugin = base16-nvim;
|
|
type = "lua";
|
|
config = "vim.cmd('colorscheme base16-${slug}')";
|
|
}
|
|
{
|
|
plugin = lualine-nvim;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
local theme = require("lualine.themes.base16")
|
|
theme.normal.b.bg = nil
|
|
theme.normal.c.bg = nil
|
|
theme.replace.b.bg = nil
|
|
theme.insert.b.bg = nil
|
|
theme.visual.b.bg = nil
|
|
theme.inactive.a.bg = nil
|
|
theme.inactive.b.bg = nil
|
|
theme.inactive.c.bg = nil
|
|
|
|
require('lualine').setup {
|
|
options = {
|
|
theme = theme,
|
|
disabled_filetypes = {'NvimTree', 'tagbar'}
|
|
},
|
|
sections = { lualine_c = {'%f'} }
|
|
}
|
|
'';
|
|
}
|
|
{
|
|
plugin = git-blame-nvim;
|
|
type = "lua";
|
|
}
|
|
{
|
|
plugin = comment-nvim;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require('Comment').setup {
|
|
pre_hook = require('ts_context_commentstring.integrations.comment_nvim').create_pre_hook()
|
|
}
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-autopairs;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require("nvim-autopairs").setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = auto-save-nvim;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require("auto-save").setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = vimtex;
|
|
config = /* vim */ ''
|
|
let g:vimtex_mappings_enabled = 0
|
|
let g:vimtex_imaps_enabled = 0
|
|
let g:vimtex_view_method = 'zathura'
|
|
let g:vimtex_compiler_latexmk = {'build_dir': '.tex'}
|
|
|
|
nnoremap <localleader>f <plug>(vimtex-view)
|
|
nnoremap <localleader>g <plug>(vimtex-compile)
|
|
nnoremap <localleader>d <plug>(vimtex-env-delete)
|
|
nnoremap <localleader>c <plug>(vimtex-env-change)
|
|
'';
|
|
}
|
|
{
|
|
plugin = vim-markdown;
|
|
config = /* vim */ ''
|
|
let g:vim_markdown_folding_disabled = 1
|
|
let g:vim_markdown_conceal = 0
|
|
let g:vim_markdown_frontmatter = 1
|
|
let g:vim_markdown_toml_frontmatter = 1
|
|
let g:vim_markdown_json_frontmatter = 1
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-ts-autotag;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require('nvim-ts-autotag').setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-surround;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require('nvim-surround').setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = tailwindcss-colors-nvim;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require('tailwindcss-colors').setup()
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-ts-context-commentstring;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require('ts_context_commentstring').setup {
|
|
enable_autocmd = false,
|
|
}
|
|
'';
|
|
}
|
|
{
|
|
plugin = nvim-treesitter.withAllGrammars;
|
|
type = "lua";
|
|
config = /* lua */ ''
|
|
require'nvim-treesitter.configs'.setup {
|
|
highlight = {
|
|
enable = true,
|
|
disable = function(lang)
|
|
return lang ~= "javascript"
|
|
and lang ~= "tsx"
|
|
and lang ~= "typescript"
|
|
and lang ~= "astro"
|
|
and lang ~= "css"
|
|
and lang ~= "glsl"
|
|
and lang ~= "nix"
|
|
and lang ~= "vue"
|
|
and lang ~= "pug"
|
|
and lang ~= "prisma"
|
|
end,
|
|
additional_vim_regex_highlighting = true,
|
|
},
|
|
}
|
|
'';
|
|
}
|
|
{
|
|
plugin = vista-vim;
|
|
config = /* vim */ ''
|
|
let g:vista_default_executive = 'nvim_lsp'
|
|
let g:vista_executive_for = {
|
|
\ 'rust': 'ctags',
|
|
\ }
|
|
|
|
autocmd QuitPre * silent! :Vista!
|
|
'';
|
|
}
|
|
fzf-vim
|
|
vim-caddyfile
|
|
vim-graphql
|
|
vim-javascript
|
|
vim-jsx-pretty
|
|
csv-vim
|
|
rust-vim
|
|
yuck-vim
|
|
neoformat
|
|
vim-crystal
|
|
vim-nix
|
|
fcitx-vim
|
|
typst-vim
|
|
tagbar
|
|
rainbow-delimiters-nvim
|
|
];
|
|
};
|
|
}
|