chore: initial commit

Moved from a94642d3e8
This commit is contained in:
Nicolas Goudry 2024-05-27 00:58:58 +02:00
commit 1c12503ebf
No known key found for this signature in database
GPG key ID: 5FC434D9FFD1DF44
15 changed files with 1434 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
result

20
LICENSE Normal file
View file

@ -0,0 +1,20 @@
Copyright (c) 2024 Nicolas Goudry
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

5
README.md Normal file
View file

@ -0,0 +1,5 @@
# NixVim config
**PERSONAL** configuration for [Neovim](https://neovim.io/) using [Nixvim](https://nix-community.github.io/nixvim/). Heavily inspired by [AstroNvim](https://astronvim.com/).
🚧 **This is a work in progress** 🚧

13
config/colorscheme.nix Normal file
View file

@ -0,0 +1,13 @@
# Use catppuccin mocha variant
{
catppuccin = {
enable = true;
settings = {
flavour = "mocha";
# Needed to keep terminal transparency, if any
transparent_background = true;
};
};
}

33
config/keymaps.nix Normal file
View file

@ -0,0 +1,33 @@
let
forceWrite = {
action = "<cmd>silent! update! | redraw<cr>";
options.desc = "Force write";
};
in
[
{
key = "<leader>n";
action = "<cmd>enew<cr>";
options.desc = "New file";
}
{
inherit (forceWrite) action options;
key = "<c-s>";
}
{
inherit (forceWrite) options;
mode = [ "i" "x" ];
key = "<c-s>";
action = "<esc>${forceWrite.action}";
}
{
key = "|";
action = "<cmd>vsplit<cr>";
options.desc = "Split vertically";
}
{
key = "\\";
action = "<cmd>split<cr>";
options.desc = "Split horizontally";
}
]

103
config/options.nix Normal file
View file

@ -0,0 +1,103 @@
# Neovim options
# Use :options to get the list of all options
# Use :h <option> to load help for given <option>
{
# Hide command line unless needed
cmdheight = 0;
# Insert mode completion options
completeopt = [ "menu" "menuone" "noselect" ];
# Copy previous indentation on autoindenting
copyindent = true;
# Highlight current line
cursorline = true;
# Expand <Tab> to spaces
expandtab = true;
# Enable fold with all code unfolded
foldcolumn = "1";
foldenable = true;
foldlevel = 99;
foldlevelstart = 99;
# Ignore case in search patterns
ignorecase = true;
# Show substitution preview in split window
inccommand = "split";
# Infer casing on word completion
infercase = true;
# Enable list mode
list = true;
# Set custom strings for list mode
# - tabulations are shown as ‒▶
# - trailing spaces are shown as ·
# - multiple non-leading consecutive spaces are shown as bullets (·)
# - non-breakable spaces are shown as ⎕
listchars = "tab:,trail:·,multispace:·,lead: ,nbsp:";
# Show line numbers
number = true;
# Preserve indentation as much as possible
preserveindent = true;
# Height of the popup menu
pumheight = 10;
# Display line numbers relative to current line
relativenumber = true;
# Minimal number of lines to keep around the cursor
# This has the effect to move the view along with current line
#scrolloff = 999;
# Number of spaces to use for indentation
shiftwidth = 2;
# Always show tabline (TODO: use with heirline?)
#showtabline = 2;
# Show signs instead of number in gutter
signcolumn = "number";
# Override ignorecase if search pattern contains uppercase characters
smartcase = true;
# Number of spaces input on <Tab>
softtabstop = 2;
# Open horizontal split below (:split)
splitbelow = true;
# Open vertical split to the right (:vsplit)
splitright = true;
# Number of spaces to represent a <Tab>
tabstop = 2;
# Enables 24-bit RGB color
termguicolors = true;
# Shorter timeout duration
timeoutlen = 500;
# Set window title to the filename
title = true;
# Save undo history to undo file (in $XDG_STATE_HOME/nvim/undo)
undofile = true;
# Enable virtual edit in visual block mode
# This has the effect of selecting empty cells beyond lines boundaries
virtualedit = "block";
# Disable line wrapping
wrap = false;
}

30
default.nix Normal file
View file

@ -0,0 +1,30 @@
{ pkgs, ... }:
{
imports = [ ./plugins ];
config = {
colorschemes = import ./config/colorscheme.nix;
keymaps = import ./config/keymaps.nix;
opts = import ./config/options.nix;
# Needed for telescope live grep
extraPackages = [ pkgs.ripgrep ];
# Use <Space> as leader key
globals.mapleader = " ";
# Set 'vi' and 'vim' aliases to nixvim
viAlias = true;
vimAlias = true;
# Setup clipboard support
clipboard = {
# Use xsel as clipboard provider
providers.xsel.enable = true;
# Sync system clipboard
register = "unnamedplus";
};
};
}

344
flake.lock generated Normal file
View file

@ -0,0 +1,344 @@
{
"nodes": {
"devshell": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"nixvim",
"nixpkgs"
]
},
"locked": {
"lastModified": 1713532798,
"narHash": "sha256-wtBhsdMJA3Wa32Wtm1eeo84GejtI43pMrFrmwLXrsEc=",
"owner": "numtide",
"repo": "devshell",
"rev": "12e914740a25ea1891ec619bb53cf5e6ca922e40",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "devshell",
"type": "github"
}
},
"flake-compat": {
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"revCount": 57,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
"flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
"nixvim",
"nixpkgs"
]
},
"locked": {
"lastModified": 1715865404,
"narHash": "sha256-/GJvTdTpuDjNn84j82cU6bXztE0MSkdnTWClUCRub78=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "8dc45382d5206bd292f9c2768b8058a8fd8311d9",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-root": {
"locked": {
"lastModified": 1713493429,
"narHash": "sha256-ztz8JQkI08tjKnsTpfLqzWoKFQF4JGu2LRz8bkdnYUk=",
"owner": "srid",
"repo": "flake-root",
"rev": "bc748b93b86ee76e2032eecda33440ceb2532fcd",
"type": "github"
},
"original": {
"owner": "srid",
"repo": "flake-root",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1701680307,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"nixvim",
"pre-commit-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"nixvim",
"nixpkgs"
]
},
"locked": {
"lastModified": 1716457508,
"narHash": "sha256-ZxzffLuWRyuMrkVVq7wastNUqeO0HJL9xqfY1QsYaqo=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "850cb322046ef1a268449cf1ceda5fd24d930b05",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"nix-darwin": {
"inputs": {
"nixpkgs": [
"nixvim",
"nixpkgs"
]
},
"locked": {
"lastModified": 1716511055,
"narHash": "sha256-5Fe/DGgvMhPEMl9VdVxv3zvwRcwNDmW5eRJ0gk72w7U=",
"owner": "lnl7",
"repo": "nix-darwin",
"rev": "0bea8222f6e83247dd13b055d83e64bce02ee532",
"type": "github"
},
"original": {
"owner": "lnl7",
"repo": "nix-darwin",
"type": "github"
}
},
"nix-formatter-pack": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"nmd": "nmd",
"nmt": "nmt"
},
"locked": {
"lastModified": 1715807870,
"narHash": "sha256-lutvG1LFGSpXsGA7U4TWfdfq6p71WdSlhw3vM4W/Opk=",
"owner": "Gerschtli",
"repo": "nix-formatter-pack",
"rev": "ab5feb867e5d074918852de6134500a82a09dc48",
"type": "github"
},
"original": {
"owner": "Gerschtli",
"repo": "nix-formatter-pack",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1716509168,
"narHash": "sha256-4zSIhSRRIoEBwjbPm3YiGtbd8HDWzFxJjw5DYSDy1n8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "bfb7a882678e518398ce9a31a881538679f6f092",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixvim": {
"inputs": {
"devshell": "devshell",
"flake-compat": "flake-compat",
"flake-parts": "flake-parts",
"flake-root": "flake-root",
"home-manager": "home-manager",
"nix-darwin": "nix-darwin",
"nixpkgs": [
"nixpkgs"
],
"pre-commit-hooks": "pre-commit-hooks",
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1716759197,
"narHash": "sha256-I4r9krPVUl1b70VbC8j8xDQ2mDBoGCx8tH9CExiJMd8=",
"owner": "nix-community",
"repo": "nixvim",
"rev": "ba293d36403c39c22dbb9a928f9af4d0df54b79f",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixvim",
"type": "github"
}
},
"nmd": {
"flake": false,
"locked": {
"lastModified": 1666190571,
"narHash": "sha256-Z1hc7M9X6L+H83o9vOprijpzhTfOBjd0KmUTnpHAVjA=",
"owner": "rycee",
"repo": "nmd",
"rev": "b75d312b4f33bd3294cd8ae5c2ca8c6da2afc169",
"type": "gitlab"
},
"original": {
"owner": "rycee",
"repo": "nmd",
"type": "gitlab"
}
},
"nmt": {
"flake": false,
"locked": {
"lastModified": 1648075362,
"narHash": "sha256-u36WgzoA84dMVsGXzml4wZ5ckGgfnvS0ryzo/3zn/Pc=",
"owner": "rycee",
"repo": "nmt",
"rev": "d83601002c99b78c89ea80e5e6ba21addcfe12ae",
"type": "gitlab"
},
"original": {
"owner": "rycee",
"repo": "nmt",
"type": "gitlab"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat_2",
"gitignore": "gitignore",
"nixpkgs": [
"nixvim",
"nixpkgs"
],
"nixpkgs-stable": [
"nixvim",
"nixpkgs"
]
},
"locked": {
"lastModified": 1716213921,
"narHash": "sha256-xrsYFST8ij4QWaV6HEokCUNIZLjjLP1bYC60K8XiBVA=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "0e8fcc54b842ad8428c9e705cb5994eaf05c26a0",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"nix-formatter-pack": "nix-formatter-pack",
"nixpkgs": "nixpkgs",
"nixvim": "nixvim"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"nixvim",
"nixpkgs"
]
},
"locked": {
"lastModified": 1715940852,
"narHash": "sha256-wJqHMg/K6X3JGAE9YLM0LsuKrKb4XiBeVaoeMNlReZg=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "2fba33a182602b9d49f0b2440513e5ee091d838b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

70
flake.nix Normal file
View file

@ -0,0 +1,70 @@
{
description = "NixVim config heavily inspired by AstroNvim";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
# Nix formatting pack
# https://gerschtli.github.io/nix-formatter-pack/nix-formatter-pack-options.html
nix-formatter-pack = {
url = "github:Gerschtli/nix-formatter-pack";
inputs.nixpkgs.follows = "nixpkgs";
};
nixvim = {
url = "github:nix-community/nixvim";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{ nixpkgs
, nixvim
, nix-formatter-pack
, ...
}:
let
forAllSystems = nixpkgs.lib.genAttrs [
"aarch64-linux"
"i686-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
];
in
{
formatter = forAllSystems (system:
nix-formatter-pack.lib.mkFormatter {
pkgs = nixpkgs.legacyPackages.${system};
config.tools = {
deadnix.enable = true;
nixpkgs-fmt.enable = true;
statix.enable = true;
};
}
);
packages = forAllSystems (system:
let
pkgs = import nixpkgs { inherit system; };
mkNixvim = specialArgs:
nixvim.legacyPackages.${system}.makeNixvimWithModule {
inherit pkgs;
module = ./.;
extraSpecialArgs = specialArgs // {
inherit pkgs;
libn = nixvim.lib.${system};
};
};
in
{
default = mkNixvim { };
lite = mkNixvim { withLSP = false; };
}
);
};
}

192
plugins/alpha.nix Normal file
View file

@ -0,0 +1,192 @@
# homepage: https://github.com/goolord/alpha-nvim
# nixvim doc: https://nix-community.github.io/nixvim/plugins/alpha/index.html
{ libn, pkgs, ... }:
let
header = {
type = "text";
# Use color defined by catppuccin
opts = {
hl = "AlphaHeader";
position = "center";
};
# Generated from https://www.asciiart.eu/text-to-ascii-art
# Font used: Graffiti
val = [
" ________ ____ ____.___ _____ "
" / _____/ \\ \\ / /| | / \\ "
"/ \\ ___ \\ Y / | |/ \\ / \\ "
"\\ \\_\\ \\ \\ / | / Y \\"
" \\______ / /\\ \\___/ |___\\____|__ /"
" \\/ \\/ \\/ "
];
};
buttons = {
type = "group";
opts.spacing = 1;
# Use function defined in lua config (see below) to generate buttons
val = [
{ __raw = "alpha_button('LDR n ', ' New File')"; }
{ __raw = "alpha_button('LDR e ', ' Explorer')"; }
{ __raw = "alpha_button('LDR f f', ' Find File')"; }
{ __raw = "alpha_button('LDR f o', '󰈙 Recents')"; }
{ __raw = "alpha_button('LDR f g', '󰈭 Live Grep')"; }
];
};
# Show random fortune as footer
footer = {
type = "text";
# Defined by Alpha
# https://github.com/goolord/alpha-nvim/blob/main/lua/alpha/fortune.lua
val.__raw = "require('alpha.fortune')()";
# Use color defined by catppuccin
opts = {
hl = "AlphaFooter";
position = "center";
};
};
layout = [
# Padding size depending on window height (taken from AstroNvim)
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/alpha.lua#L141
{
type = "padding";
val.__raw = "vim.fn.max { 2, vim.fn.floor(vim.fn.winheight(0) * 0.2) }";
}
header
{ type = "padding"; val = 5; }
buttons
{ type = "padding"; val = 3; }
footer
];
in
{
extra = {
packages = with pkgs.vimPlugins; [
alpha-nvim
nvim-web-devicons
];
# Based on Alpha dashboard theme with tweaks from AstroNvim
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/alpha.lua#L86-L112
# https://github.com/goolord/alpha-nvim/blob/main/lua/alpha/themes/dashboard.lua#L46-L73
config = ''
local alpha_leader = "LDR"
function alpha_button(shortcut, desc, keybind, keybind_opts)
local sc = shortcut:gsub("%s", ""):gsub(alpha_leader, "<leader>")
local real_leader = vim.g.mapleader
if real_leader == " " then real_leader = "SPC" end
local opts = {
position = "center",
shortcut = shortcut:gsub(alpha_leader, real_leader),
cursor = -2,
width = 36,
align_shortcut = "right",
hl = "AlphaButtons",
hl_shortcut = "AlphaShortcut",
}
if keybind then
keybind_opts = if_nil(keybind_opts, { noremap = true, silent = true, nowait = true, desc = desc })
opts.keymap = { "n", sc, keybind, keybind_opts }
end
local function on_press()
local key = vim.api.nvim_replace_termcodes(keybind or sc .. "<ignore>", true, false, true)
vim.api.nvim_feedkeys(key, "t", false)
end
return {
type = "button",
val = desc,
on_press = on_press,
opts = opts,
}
end
require("alpha").setup({
layout = ${libn.helpers.toLuaObject layout},
})
'';
};
rootOpts = {
autoGroups.alpha = { };
# Custom autocommand (taken from AstroNvim)
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/alpha.lua#L19-L43
autoCmd = [
{
desc = "Disable status, tablines and cmdheight for alpha";
event = [ "User" "BufWinEnter" ];
group = "alpha";
callback.__raw = ''
function(event)
if
(
(event.event == "User" and event.file == "AlphaReady")
or (event.event == "BufWinEnter" and vim.bo[event.buf].filetype == "alpha")
) and not vim.g.before_alpha
then
vim.g.before_alpha = {
showtabline = vim.opt.showtabline:get(),
laststatus = vim.opt.laststatus:get(),
cmdheight = vim.opt.cmdheight:get(),
}
vim.opt.showtabline, vim.opt.laststatus, vim.opt.cmdheight = 0, 0, 0
elseif vim.g.before_alpha and event.event == "BufWinEnter" and vim.bo[event.buf].buftype ~= "nofile" then
vim.opt.laststatus, vim.opt.showtabline, vim.opt.cmdheight =
vim.g.before_alpha.laststatus, vim.g.before_alpha.showtabline, vim.g.before_alpha.cmdheight
vim.g.before_alpha = nil
end
end
'';
}
];
colorschemes.catppuccin.settings = {
# Enable catppuccin colors
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/alpha.lua
integrations.alpha = true;
# Override default catppuccin header color
custom_highlights = ''
function(colors)
return {
AlphaHeader = { fg = colors.red },
}
end
'';
};
keymaps = [
{
key = "<leader>h";
options.desc = "Home screen";
# Open alpha in a non neo-tree window (taken from AstroNvim)
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/alpha.lua#L10-L16
action.__raw = ''
function()
local wins = vim.api.nvim_tabpage_list_wins(0)
if #wins > 1 and vim.bo[vim.api.nvim_win_get_buf(wins[1])].filetype == "neo-tree" then
vim.fn.win_gotoid(wins[2])
end
require("alpha").start(false)
end
'';
}
];
};
}

62
plugins/default.nix Normal file
View file

@ -0,0 +1,62 @@
# This file will load all plugins defined in the current directory (plugins)
# and load their content in the 'plugins' nixvim attribute.
# Each plugin file must export a lambda, which is called with an attrset
# containing nixpkgs library as 'lib'. Plugins may or may not use it.
# For plugins natively supported by nixvim, the plugin file must have the same
# name as the plugin attribute name expected by nixvim (ie. 'telescope.nix' for
# 'plugins.telescope'). The plugin lambda must return an attrset with at least
# the 'opts' attribute, this attribute is the plugin options as expected by
# nixvim.
# For plugins not supported by nixvim, the plugin file can have any name. The
# plugin lambda must return an attrset with the 'extra' attribute which is also
# an attrset with two attributes: 'package' and 'config'. The 'package'
# attribute is the plugin package in nixpkgs (ie. vimPlugins.<plugin>). The
# 'config' attribute is the plugin configuration in Lua format.
# Additionally, a 'rootOpts' can be returned alongside other attributes, this
# attribute will be used to set extra options to the root nixvim options. For
# example, this allows to set keymaps for plugins that do not have an internal
# option to set keymaps.
{ lib, ... }@args:
let
# Flag to enable LSP plugin with servers
# Given as an extra special arg when building nixvim module
withLSP = args.withLSP or true;
# Load plugins filenames in list
definitions = lib.attrNames (
lib.filterAttrs
(filename: kind:
filename != "default.nix"
&& (kind == "regular" || kind == "directory")
# If file is an LSP plugin, respect withLSP flag
&& (if filename == "lsp.nix" then withLSP else true)
)
(builtins.readDir ./.)
);
in
lib.mkMerge (
map
(file:
let
pluginName = lib.elemAt (lib.splitString "." file) 0;
plugin = import ./${file} args;
in
lib.mkMerge [
(lib.optionalAttrs (plugin ? opts) {
plugins.${pluginName} = plugin.opts;
})
(lib.optionalAttrs (plugin ? extra) {
extraConfigLua = plugin.extra.config or "";
extraPlugins = plugin.extra.packages;
})
(plugin.rootOpts or { })
]
)
definitions
)

266
plugins/neo-tree.nix Normal file
View file

@ -0,0 +1,266 @@
# homepage: https://github.com/nvim-neo-tree/neo-tree.nvim
# nixvim doc: https://nix-community.github.io/nixvim/plugins/neo-tree/index.html
_:
{
opts = {
enable = true;
# Automatically clean up broken neo-tree buffers saved in sessions
autoCleanAfterSessionRestore = true;
# Close Neo-tree if it is the last window left in the tab
closeIfLastWindow = true;
# Disable fold column (gutter)
eventHandlers = {
neo_tree_buffer_enter = ''
function(_)
vim.opt_local.signcolumn = "auto"
vim.opt_local.foldcolumn = "0"
end
'';
};
# Extra options not exposed by the plugin
extraOptions = {
# Custom functions (taken from AstroNvim)
commands = {
# Focus first directory child item or open directory
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L120-L135
child_or_open.__raw = ''
function(state)
local node = state.tree:get_node()
if node:has_children() then
if not node:is_expanded() then -- if unexpanded, expand
state.commands.toggle_node(state)
else -- if expanded and has children, select the next child
if node.type == "file" then
state.commands.open(state)
else
require("neo-tree.ui.renderer").focus_node(state, node:get_child_ids()[1])
end
end
else -- if has no children
state.commands.open(state)
end
end
'';
# Copy various path format of currently focused item
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L136-L168
copy_selector.__raw = ''
function(state)
local node = state.tree:get_node()
local filepath = node:get_id()
local filename = node.name
local modify = vim.fn.fnamemodify
local vals = {
["BASENAME"] = modify(filename, ":r"),
["EXTENSION"] = modify(filename, ":e"),
["FILENAME"] = filename,
["PATH (CWD)"] = modify(filepath, ":."),
["PATH (HOME)"] = modify(filepath, ":~"),
["PATH"] = filepath,
["URI"] = vim.uri_from_fname(filepath),
}
local options = vim.tbl_filter(function(val) return vals[val] ~= "" end, vim.tbl_keys(vals))
if vim.tbl_isempty(options) then
return
end
table.sort(options)
vim.ui.select(options, {
prompt = "Choose to copy to clipboard:",
format_item = function(item) return ("%s: %s"):format(item, vals[item]) end,
}, function(choice)
local result = vals[choice]
if result then
vim.fn.setreg("+", result)
end
end)
end
'';
# Find file in currently focused item if it is a directory, or its closest parent directory
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L205-L209
find_file_in_dir.__raw = ''
function(state)
local node = state.tree:get_node()
local path = node.type == "file" and node:get_parent_id() or node:get_id()
TelescopeWithTheme('find_files', { cwd = path })
end
'';
# Live grep in currently focused item if it is a directory, or its closest parent directory
grep_in_dir.__raw = ''
function(state)
local node = state.tree:get_node()
local path = node.type == "file" and node:get_parent_id() or node:get_id()
TelescopeWithTheme('live_grep', { cwd = path })
end
'';
# Focus parent directory of currently focused item or close directory
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L112-L119
parent_or_close.__raw = ''
function(state)
local node = state.tree:get_node()
if node:has_children() and node:is_expanded() then
state.commands.toggle_node(state)
else
require("neo-tree.ui.renderer").focus_node(state, node:get_parent_id())
end
end
'';
};
window = {
# Keymaps for filter popup window in fuzzy finder mode (ie. "/")
fuzzy_finder_mappings = {
"<C-J>" = "move_cursor_down";
"<C-K>" = "move_cursor_up";
};
# Keymaps when neotree window is focused
mappings = {
"[b" = "prev_source";
"]b" = "next_source";
# Disable default behavior to toggle node on Space keypress
"<Space>".__raw = "false";
# See extraOptions.commands for details on following keymaps
h = "parent_or_close";
l = "child_or_open";
F = "find_file_in_dir";
W = "grep_in_dir";
Y = "copy_selector";
};
};
};
defaultComponentConfigs = {
gitStatus.symbols = {
added = "";
conflict = "";
deleted = "";
ignored = "";
modified = "";
renamed = "";
staged = "";
unstaged = "";
untracked = "";
};
};
filesystem = {
# Find and focus file in active buffer
followCurrentFile.enabled = true;
# Open neotree "fullscreen" when opening a directory
hijackNetrwBehavior = "open_current";
};
# Sources tabs
sourceSelector = {
# Label position
contentLayout.__raw = "'center'";
# No tabs separator
separator = "";
# Show tabs on winbar
winbar = true;
# Sources to show and their labels
sources = [
{
displayName = " Files";
source = "filesystem";
}
{
displayName = "󰈙 Bufs";
source = "buffers";
}
{
displayName = "󰊢 Git";
source = "git_status";
}
];
};
};
rootOpts = {
# Enable catppuccin colors
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/neotree.lua
colorschemes.catppuccin.settings.integrations.neotree = true;
autoGroups.neotree = { };
# Custom autocommands (taken from AstroNvim)
autoCmd = [
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L21-L37
{
desc = "Open explorer on startup with directory";
event = "BufEnter";
group = "neotree";
callback.__raw = ''
function()
if package.loaded["neo-tree"] then
return true
else
local stats = vim.loop.fs_stat(vim.api.nvim_buf_get_name(0))
if stats and stats.type == "directory" then
return true
end
end
end
'';
}
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L25-L35
{
desc = "Refresh explorer sources when closing lazygit";
event = "TermClose";
group = "neotree";
pattern = "*lazygit*";
callback.__raw = ''
function()
local manager_avail, manager = pcall(require, "neo-tree.sources.manager")
if manager_avail then
for _, source in ipairs { "filesystem", "git_status", "document_symbols" } do
local module = "neo-tree.sources." .. source
if package.loaded[module] then manager.refresh(require(module).name) end
end
end
end
'';
}
];
keymaps = [
{
key = "<leader>e";
action = "<cmd>Neotree toggle<cr>";
options.desc = "Toggle explorer";
}
{
key = "<leader>o";
options.desc = "Toggle explorer focus";
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/neo-tree.lua#L12-L18
action.__raw = ''
function()
if vim.bo.filetype == "neo-tree" then
vim.cmd.wincmd "p"
else
vim.cmd.Neotree "focus"
end
end
'';
}
];
};
}

132
plugins/telescope.nix Normal file
View file

@ -0,0 +1,132 @@
# homepage: https://github.com/nvim-telescope/telescope.nvim
# nixvim doc: https://nix-community.github.io/nixvim/plugins/telescope/index.html
{ libn, ... }:
{
opts = {
enable = true;
};
rootOpts = {
# Enable catppuccin colors
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/telescope.lua
colorschemes.catppuccin.settings.integrations.telescope.enabled = true;
# Set custom behavior for dropdown theme:
# - use 80% of window width
# - use all window height
# - display preview at bottom
# ┌──────────────────────────────────────────────────┐
# │ ┌────────────────────────────────────────┐ │
# │ │ Prompt │ │
# │ ├────────────────────────────────────────┤ │
# │ │ Result │ │
# │ │ Result │ │
# │ └────────────────────────────────────────┘ │
# │ ┌────────────────────────────────────────┐ │
# │ │ Preview │ │
# │ │ Preview │ │
# │ │ Preview │ │
# │ │ Preview │ │
# │ │ Preview │ │
# │ │ Preview │ │
# │ └────────────────────────────────────────┘ │
# └──────────────────────────────────────────────────┘
extraConfigLuaPre = ''
local TelescopeWithTheme = function(fn, args)
args.layout_config = {
anchor = "N",
mirror = true,
width = 0.8,
}
if fn == "keymaps" or fn == "registers" then args.layout_config.height = function(_, _, max_lines) return max_lines end end
require("telescope.builtin")[fn](require("telescope.themes").get_dropdown(args))
end
'';
# Use root keymaps to allow usage of custom TelescopeWithTheme function
keymaps =
let
mkTelescopeKeymap =
{ key
, mode ? "n"
, fn
, args ? { __empty = true; }
, desc ? ""
}: {
inherit key mode;
action.__raw = "function() TelescopeWithTheme('${fn}', ${libn.helpers.toLuaObject args}) end";
options = { inherit desc; };
};
in
map mkTelescopeKeymap [
{
desc = "Resume previous search";
key = "<leader>f<cr>";
fn = "resume";
}
{
desc = "Find words in current buffer";
key = "<leader>f/";
fn = "current_buffer_fuzzy_find";
}
{
desc = "Find buffers";
key = "<leader>fb";
fn = "buffers";
}
{
desc = "Find files";
key = "<leader>ff";
fn = "find_files";
}
{
desc = "Find all files";
key = "<leader>fF";
fn = "find_files";
args = {
hidden = true;
no_ignore = true;
};
}
{
desc = "Find words";
key = "<leader>fg";
fn = "live_grep";
}
{
desc = "Find help tags";
key = "<leader>fh";
fn = "help_tags";
}
{
desc = "Find keymaps";
key = "<leader>fk";
fn = "keymaps";
}
{
desc = "Find history";
key = "<leader>fo";
fn = "oldfiles";
}
{
desc = "Find registers";
key = "<leader>fr";
fn = "registers";
}
{
desc = "Find word under cursor";
key = "<leader>fw";
fn = "grep_string";
}
{
desc = "Search references";
key = "gr";
fn = "lsp_references";
}
];
};
}

142
plugins/treesitter.nix Normal file
View file

@ -0,0 +1,142 @@
# homepage: https://github.com/nvim-treesitter/nvim-treesitter
# nixvim doc: https://nix-community.github.io/nixvim/plugins/treesitter/index.html
_:
{
opts = {
# Enable treesitter syntax highlighting
enable = true;
# Enable treesitter based indentation (use '=' to auto-indent)
indent = true;
# Enable incremental selection
# Keymaps are defined as global nixvim keymaps
incrementalSelection.enable = true;
};
rootOpts = {
# Enable catppuccin colors
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/treesitter.lua
colorschemes.catppuccin.settings.integrations.treesitter = true;
keymaps = [
{
mode = [ "n" "x" "o" ];
key = ",";
action.__raw = "function() require('nvim-treesitter.textobjects.repeatable_move').repeat_last_move() end";
options.desc = "Repeat last move";
}
{
mode = [ "n" "x" "o" ];
key = ";";
action.__raw = "function() require('nvim-treesitter.textobjects.repeatable_move').repeat_last_move_opposite() end";
options.desc = "Repeat last move in the opposite direction";
}
# Workaround for setting descriptions to treesitter incremental selection keymaps
# See https://github.com/nix-community/nixvim/issues/1506
{
mode = "n";
key = "<leader>ss";
action.__raw = "function() require('nvim-treesitter.incremental_selection').init_selection() end";
options.desc = "Start incremental selection";
}
{
mode = "v";
key = "<leader>sd";
action.__raw = "function() require('nvim-treesitter.incremental_selection').node_decremental() end";
options.desc = "Decrement selection";
}
{
mode = "v";
key = "<leader>si";
action.__raw = "function() require('nvim-treesitter.incremental_selection').node_incremental() end";
options.desc = "Increment selection by node";
}
{
mode = "v";
key = "<leader>sc";
action.__raw = "function() require('nvim-treesitter.incremental_selection').scope_incremental() end";
options.desc = "Increment selection by scope";
}
];
# Treesitter textobjects configuration
plugins.treesitter-textobjects = {
enable = true;
# Jump across text objects
move = {
enable = true;
setJumps = true;
gotoNextStart = {
"]k" = { query = "@block.outer"; desc = "Next block start"; };
"]f" = { query = "@function.outer"; desc = "Next function start"; };
"]a" = { query = "@parameter.inner"; desc = "Next argument start"; };
};
gotoNextEnd = {
"]K" = { query = "@block.outer"; desc = "Next block end"; };
"]F" = { query = "@function.outer"; desc = "Next function end"; };
"]A" = { query = "@parameter.inner"; desc = "Next argument end"; };
};
gotoPreviousStart = {
"[k" = { query = "@block.outer"; desc = "Previous block start"; };
"[f" = { query = "@function.outer"; desc = "Previous function start"; };
"[a" = { query = "@parameter.inner"; desc = "Previous argument start"; };
};
gotoPreviousEnd = {
"[K" = { query = "@block.outer"; desc = "Previous block end"; };
"[F" = { query = "@function.outer"; desc = "Previous function end"; };
"[A" = { query = "@parameter.inner"; desc = "Previous argument end"; };
};
};
# Select text objects
select = {
enable = true;
# Automatically jump to next textobjects, ie. if a keymap is pressed
# while the cursor is not under a textobject, the next relevant
# textobject will be used as "source", similar to the default nvim
# behavior
lookahead = true;
keymaps = {
ak = { query = "@block.outer"; desc = "around block"; };
ik = { query = "@block.inner"; desc = "inside block"; };
ac = { query = "@class.outer"; desc = "around class"; };
ic = { query = "@class.inner"; desc = "inside class"; };
"a?" = { query = "@conditional.outer"; desc = "around conditional"; };
"i?" = { query = "@conditional.inner"; desc = "inside conditional"; };
af = { query = "@function.outer"; desc = "around function"; };
"if" = { query = "@function.inner"; desc = "inside function"; };
ao = { query = "@loop.outer"; desc = "around loop"; };
io = { query = "@loop.inner"; desc = "inside loop"; };
aa = { query = "@parameter.outer"; desc = "around argument"; };
ia = { query = "@parameter.inner"; desc = "inside argument"; };
};
};
# Swap nodes with next/previous one
swap = {
enable = true;
swapNext = {
">K" = { query = "@block.outer"; desc = "Swap next block"; };
">F" = { query = "@function.outer"; desc = "Swap next function"; };
">A" = { query = "@parameter.inner"; desc = "Swap next argument"; };
};
swapPrevious = {
"<K" = { query = "@block.outer"; desc = "Swap previous block"; };
"<F" = { query = "@function.outer"; desc = "Swap previous function"; };
"<A" = { query = "@parameter.inner"; desc = "Swap previous argument"; };
};
};
};
};
}

21
plugins/which-key.nix Normal file
View file

@ -0,0 +1,21 @@
# homepage: https://github.com/folke/which-key.nvim
# nixvim doc: https://nix-community.github.io/nixvim/plugins/which-key/index.html
_:
{
opts = {
enable = true;
window.border = "single";
# Disable which-key when in neo-tree or telescope
disable.filetypes = [
"TelescopePrompt"
"neo-tree"
"neo-tree-popup"
];
};
# Enable catppuccin colors
# https://github.com/catppuccin/nvim/blob/main/lua/catppuccin/groups/integrations/which_key.lua
rootOpts.colorschemes.catppuccin.settings.integrations.which_key = true;
}