niksos/modules/tui/neovim/config.nix

266 lines
10 KiB
Nix

{
config,
inputs,
lib,
pkgs,
...
}: let
cfg = config.poz.programs.neovim;
inherit (config.poz.other.system) username;
inherit (lib.meta) getExe;
inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption;
inherit (lib.strings) concatStrings;
glsl_analyzer = getExe pkgs.glsl_analyzer;
in {
options.poz.programs.neovim = {
enable = mkEnableOption "neovim";
enableLsp = mkEnableOption "neovim lsps";
};
config = mkIf cfg.enable {
environment.sessionVariables = {
EDITOR = "nvim";
};
home-manager.users.${username} = {
imports = [ inputs.nvf.homeManagerModules.default ];
programs.nvf = {
enable = true;
settings.vim = {
viAlias = false;
vimAlias = false;
enableLuaLoader = true;
scrollOffset = 7;
preventJunkFiles = true;
tabWidth = 4;
autoIndent = false;
cmdHeight = 1;
useSystemClipboard = false;
luaConfigPost = concatStrings [
# https://github.com/NotAShelf/nyx/blob/main/homes/notashelf/programs/terminal/editors/neovim/lua/core.lua#L34-L42
''
vim.opt.formatoptions:remove('c')
vim.opt.formatoptions:remove('r')
vim.opt.formatoptions:remove('o')
''
];
additionalRuntimePaths = [ ./runtime ];
theme = {
enable = true;
name = "catppuccin";
style = "mocha";
};
maps = {
normal = {
"<leader>v" = {
action = "<CMD>Neotree toggle<CR>";
silent = true;
};
"<leader>m" = {
action = "<CMD>MarkdownPreviewToggle<CR>";
silent = true;
};
};
terminal = {
# get out of terminal mode in toggleterm
"<ESC>" = {
action = "<C-\\><C-n>";
silent = true;
};
};
};
statusline.lualine = {
enable = true;
theme = "catppuccin";
};
extraPlugins = {
zen-mode.package = pkgs.vimPlugins.zen-mode-nvim;
unicode.package = pkgs.vimPlugins.unicode-vim;
repolink = {
package = pkgs.stdenv.mkDerivation {
name = "repolink";
src = pkgs.fetchFromGitHub {
owner = "9seconds";
repo = "repolink.nvim";
rev = "55edfedbaef3e894d2ab5107ea7fadc64cb8258d";
hash = "sha256-ykCswLzq38tO0GE4IB0dT3g239qkKpoW+d27sCorR90=";
};
installPhase = ''
runHook preInstall
cp -r . $out
runHook postInstall
'';
};
setup = /*lua*/''
require("repolink").setup({
url_builders = {
["github"] = require("repolink").url_builder_for_github("https://github.com"),
["gitlab"] = require("repolink").url_builder_for_gitlab("https://gitlab.com"),
["codeberg"] = require("repolink").url_builder_for_gitea("https://codeberg.org"),
["jacekpoz"] = require("repolink").url_builder_for_gitea("https://git.jacekpoz.pl"),
["outfoxxed"] = require("repolink").url_builder_for_gitea("https://git.outfoxxed.me"),
},
custom_url_parser = function(remote_url)
local host, user, project = string.match(
remote_url,
"^([^:]+):([^/]+)/(.+)$"
)
if host then
return host, {
user = user,
project = project
}
end
end
})
'';
};
};
treesitter = {
enable = true;
fold = true;
context.enable = true;
grammars = [ pkgs.vimPlugins.nvim-treesitter.builtGrammars.glsl ];
};
autocomplete = {
enable = true;
alwaysComplete = false;
};
filetree.neo-tree = {
enable = true;
};
terminal.toggleterm = {
enable = true;
setupOpts.direction = "tab";
mappings.open = "<C-\\>";
# TODO shading_factor
# TODO shade_terminals
# TODO size
};
git = {
enable = true;
gitsigns = {
enable = true;
# TODO enable / disable all the settings
};
};
lsp = mkIf cfg.enableLsp {
enable = true;
lspSignature.enable = true;
lspconfig = {
enable = true;
sources = {
glsl_analyzer = /*lua*/''
lspconfig.glsl_analyzer.setup {
on_attach = default_on_attach;
cmd = { "${glsl_analyzer}" };
}
'';
};
};
mappings = {
addWorkspaceFolder = "<leader>wa";
codeAction = "<leader>a";
format = "<C-f>";
goToDeclaration = "gD";
goToDefinition = "gd";
hover = "K";
listImplementations = "gi";
listReferences = "gr";
listWorkspaceFolders = "<leader>wl";
nextDiagnostic = "<leader>k";
previousDiagnostic = "<leader>j";
openDiagnosticFloat = "<leader>e";
removeWorkspaceFolder = "<leader>wr";
renameSymbol = "<leader>r";
signatureHelp = "<C-k>";
};
};
languages = mkIf cfg.enableLsp {
enableDAP = true;
enableExtraDiagnostics = true;
enableFormat = true;
enableLSP = true;
enableTreesitter = true;
bash.enable = true;
clang = {
enable = true;
cHeader = true;
};
css.enable = true;
html.enable = true;
java.enable = true;
markdown.enable = true;
nix.enable = true;
ocaml.enable = true;
rust = {
enable = true;
crates.enable = true;
};
ts.enable = true;
};
utility = {
motion.leap.enable = true;
preview.markdownPreview.enable = true;
# TODO settings.theme = "dark";
surround = {
enable = true;
useVendoredKeybindings = true;
};
new-file-template.enable = true;
};
visuals = {
enable = true;
fidget-nvim.enable = true;
};
# TODO laytan/cloak.nvim
telescope.enable = true;
comments.comment-nvim.enable = true;
# TODO learn and add harpoon
notes = {
todo-comments = {
enable = true;
mappings.telescope = "<leader>tt";
setupOpts.highlight.pattern = ".*<(KEYWORDS)\s*";
};
orgmode = {
enable = true;
setupOpts = {
org_agenda_files = [ "~/Notes/org" ];
org_default_notes_file = "~/Notes/org/refile.org";
};
treesitter.enable = true;
};
};
};
};
};
};
}