Signed-off-by: Lander Van den Bulcke <landervandenbulcke@gmail.com>
This commit is contained in:
Lander Van den Bulcke 2025-10-10 14:02:21 +02:00
parent ff2c59724a
commit 5c5c106495
Signed by: lander
GPG key ID: 0142722B4B0C536F
29 changed files with 2445 additions and 109 deletions

125
flake.lock generated
View file

@ -73,10 +73,30 @@
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1759523803,
"narHash": "sha256-PTod9NG+i3XbbnBKMl/e5uHDBYpwIWivQ3gOWSEuIEM=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "cfc9f7bb163ad8542029d303e599c0f7eee09835",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"pre-commit-hooks",
"git-hooks",
"nixpkgs"
]
},
@ -124,16 +144,16 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1759036355,
"narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=",
"owner": "nixos",
"lastModified": 1759070547,
"narHash": "sha256-JVZl8NaVRYb0+381nl7LvPE+A774/dRpif01FKLrYFQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127",
"rev": "647e5c14cbd5067f44ac86b74f014962df460840",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
@ -153,7 +173,39 @@
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1759735786,
"narHash": "sha256-a0+h02lyP2KwSNrZz4wLJTu9ikujNsTWIC874Bv7IJ0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "20c4598c84a671783f741e02bf05cbfaf4907cff",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-25.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1759036355,
"narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1758763312,
"narHash": "sha256-puBMviZhYlqOdUUgEmMVJpXqC/ToEqSvkyZ30qQ09xM=",
@ -169,26 +221,10 @@
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1758029226,
"narHash": "sha256-TjqVmbpoCqWywY9xIZLTf6ANFvDCXdctCjoYuYPYdMI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "08b8f92ac6354983f5382124fef6006cade4a1c1",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixvim": {
"inputs": {
"flake-parts": "flake-parts_2",
"nixpkgs": "nixpkgs_2",
"nixpkgs": "nixpkgs_3",
"nuschtosSearch": "nuschtosSearch",
"systems": "systems_2"
},
@ -229,32 +265,14 @@
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1758108966,
"narHash": "sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "54df955a695a84cd47d4a43e08e1feaf90b1fd9b",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs",
"git-hooks": "git-hooks",
"nixpkgs": "nixpkgs_2",
"nixpkgs-stable": "nixpkgs-stable",
"nixvim": "nixvim",
"pre-commit-hooks": "pre-commit-hooks"
"systems": "systems_3"
}
},
"systems": {
@ -286,6 +304,21 @@
"repo": "default",
"type": "github"
}
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",

View file

@ -1,75 +1,25 @@
{
description = "deCort.tech NeoVim configuration";
description = "EscapeAngle NeoVim configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.05";
flake-parts.url = "github:hercules-ci/flake-parts";
nixvim = {
url = "github:nix-community/nixvim";
};
pre-commit-hooks = {
url = "github:cachix/pre-commit-hooks.nix";
};
nixvim.url = "github:nix-community/nixvim";
systems.url = "github:nix-systems/default";
git-hooks.url = "github:cachix/git-hooks.nix";
git-hooks.flake = false;
};
outputs =
{
nixpkgs,
nixvim,
flake-parts,
pre-commit-hooks,
...
}@inputs:
inputs@{ flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = [
"aarch64-linux"
"x86_64-linux"
"aarch64-darwin"
"x86_64-darwin"
systems = import inputs.systems;
_module.args = { inherit inputs; };
imports = [
./modules/flake
./overlays
./plugins
];
perSystem =
{
pkgs,
system,
self',
lib,
...
}:
let
nixvimLib = nixvim.lib.${system};
nixvim' = nixvim.legacyPackages.${system};
nixvimModule = {
inherit pkgs;
module = import ./config; # import the module directly
# You can use `extraSpecialArgs` to pass additional arguments to your module files
extraSpecialArgs = {
# inherit (inputs) foo;
};
};
nvim = nixvim'.makeNixvimWithModule nixvimModule;
in
{
checks = {
default = nixvimLib.check.mkTestDerivationFromNixvimModule nixvimModule;
pre-commit-check = pre-commit-hooks.lib.${system}.run {
src = ./.;
hooks = {
statix.enable = true;
nixfmt-rfc-style.enable = true;
};
};
};
formatter = pkgs.nixfmt-rfc-style;
packages = {
default = nvim;
};
devShells = {
default = with pkgs; mkShell { inherit (self'.checks.pre-commit-check) shellHook; };
};
};
};
}

23
modules/flake/default.nix Normal file
View file

@ -0,0 +1,23 @@
{ inputs, self, ... }:
{
debug = true;
imports = [ ./devshell.nix ];
perSystem =
{ lib, system, ... }:
{
_module.args = {
flake = { inherit inputs self; };
pkgs = import inputs.nixpkgs {
inherit system;
overlays = lib.attrValues self.overlays;
config.allowUnfree = true;
};
};
imports = [
(self + /packages)
];
};
}

View file

@ -0,0 +1,32 @@
{ inputs, ... }:
{
imports = [
(inputs.git-hooks + /flake-module.nix)
];
perSystem =
{ config, pkgs, ... }:
{
devShells.default = pkgs.mkShell rec {
name = "nixvim";
meta.description = "Dev environment for nixvim configuration";
inputsFrom = [ config.pre-commit.devShell ];
packages = with pkgs; [
nil
nix-output-monitor
nixfmt-rfc-style
];
shellHook = ''
echo 1>&2 "🐼: $(id -un) | 🧬: $(nix eval --raw --impure --expr 'builtins.currentSystem') | 🐧: $(uname -r) "
echo 1>&2 "Ready to work on ${name}!"
'';
};
pre-commit.settings = {
hooks.nixfmt-rfc-style.enable = true;
};
};
}

12
overlays/default.nix Normal file
View file

@ -0,0 +1,12 @@
{ inputs, self, ... }:
{
flake.overlays.default = (
final: prev: {
stable = import inputs.nixpkgs-stable {
allowUnfree = true;
inherit (prev) system;
overlays = prev.lib.attrValues self.overlays;
};
}
);
}

37
packages/default.nix Normal file
View file

@ -0,0 +1,37 @@
{
flake,
inputs',
self',
...
}:
let
mkNixVim =
module:
inputs'.nixvim.legacyPackages.makeNixvimWithModule {
extraSpecialArgs = { inherit inputs self; };
inherit module;
};
inherit (flake) inputs self;
bareModules = [
self.myvimPlugins.common
self.myvimPlugins.buffer
self.myvimPlugins.snacks
self.myvimPlugins.ux
];
coreModules = bareModules ++ [
self.myvimPlugins.blink-cmp
self.myvimPlugins.git
self.myvimPlugins.lang
self.myvimPlugins.lsp
self.myvimPlugins.lualine
self.myvimPlugins.noice
self.myvimPlugins.treesitter
];
in
{
packages = {
default = self'.packages.core;
bare = mkNixVim bareModules;
core = mkNixVim coreModules;
};
}

69
plugins/blink-cmp.nix Normal file
View file

@ -0,0 +1,69 @@
{ lib, ... }:
let
inherit (lib.nixvim) mkRaw;
in
{
plugins = {
blink-cmp = {
enable = true;
settings = {
completion.menu.border = "rounded";
keymap = {
"<C-j>" = [
"select_next"
"fallback"
];
"<C-k>" = [
"select_prev"
"fallback"
];
"<c-l>" = [
"snippet_forward"
"fallback"
];
"<c-h>" = [
"snippet_backward"
"fallback"
];
"<c-u>" = [
"scroll_documentation_up"
"fallback"
];
"<c-d>" = [
"scroll_documentation_down"
"fallback"
];
"<C-space>" = [
(
# lua
mkRaw ''
function(cmp)
local ok,_ = pcall(require, "copilot")
if ok then
vim.g.copilot_no_tab_map = true
vim.g.copilot_assume_mapped = true
vim.g.copilot_tab_fallback = ""
local suggestion = require("copilot.suggestion")
if suggestion.is_visible() then
suggestion.accept()
else
if cmp.snippet_active() then
return cmp.select_and_accept()
else
return cmp.accept()
end
end
end
end
''
)
];
};
};
};
};
}

86
plugins/buffer.nix Normal file
View file

@ -0,0 +1,86 @@
{ config, lib, ... }:
let
inherit (config.myvim.mkKey) mkKeymap wKeyObj;
inherit (lib.nixvim) mkRaw;
in
{
plugins = {
bufferline = {
enable = true;
settings.options = rec {
diagnostics = "nvim_lsp";
buffer_close_icon = "󰅙";
close_icon = buffer_close_icon;
always_show_bufferline = true;
hover = {
enabled = true;
delay = 200;
reveal = [ "close" ];
};
};
};
harpoon.enable = true;
};
wKeyList = [
(wKeyObj [
"<leader>b"
""
"buffers"
])
(wKeyObj [
"<leader><tab>"
""
"tabs"
])
];
keymaps = [
(mkKeymap "n" "<leader>b." (
# lua
mkRaw ''
function()
harpoon = require("harpoon")
harpoon:list():add()
end
''
) "Add File to Harpoon")
(mkKeymap "n" "<leader>bb" (
# lua
mkRaw ''
function()
harpoon = require("harpoon")
harpoon.ui:toggle_quick_menu(harpoon:list())
end
''
) "Harpoon ui")
(mkKeymap "n" "<leader>bp" "<cmd>:BufferLinePick<cr>" "Buffer Line Pick")
(mkKeymap "n" "<leader>qc" "<cmd>:bp | bd #<cr>" "Buffer close")
(mkKeymap "n" "<leader>bP" "<cmd>BufferLineTogglePin<cr>" "Buffer Pin")
(mkKeymap "n" "<leader>bd" "<cmd>BufferLineSortByDirectory<cr>" "Buffer Sort by dir")
(mkKeymap "n" "<leader>be" "<cmd>BufferLineSortByExtension<cr>" "Buffer Sort by ext")
(mkKeymap "n" "<leader>bt" "<cmd>BufferLineSortByTabs<cr>" "Buffer Sort by Tabs")
(mkKeymap "n" "<leader>bL" "<cmd>BufferLineCloseRight<cr>" "Buffer close all to right")
(mkKeymap "n" "<leader>bH" "<cmd>BufferLineCloseLeft<cr>" "Buffer close all to left")
(mkKeymap "n" "<leader>bc" "<cmd>BufferLineCloseOther<cr>"
"Buffer close all except the current buffer"
)
(mkKeymap "n" "<a-s-h>" "<cmd>BufferLineMovePrev<cr>" "Move buffer to left")
(mkKeymap "n" "<a-s-l>" "<cmd>BufferLineMoveNext<cr>" "Move buffer to right")
(mkKeymap "n" "<s-h>" ":BufferLineCyclePrev<cr>" "Buffer Previous")
(mkKeymap "n" "<s-l>" ":BufferLineCycleNext<cr>" "Buffer Next")
(mkKeymap "n" "<leader><tab>j" "<cmd>tabn<cr>" "Next Tab")
(mkKeymap "n" "<leader><tab>k" "<cmd>tabp<cr>" "Previous Tab")
(mkKeymap "n" "<leader><tab>l" "<cmd>tabn<cr>" "Next Tab")
(mkKeymap "n" "<leader><tab>h" "<cmd>tabp<cr>" "Previous Tab")
(mkKeymap "n" "<leader>qt" "<cmd>tabclose<cr>" "Close Tab")
(mkKeymap "n" "<leader><tab>q" "<cmd>tabclose<cr>" "Close Tab")
(mkKeymap "n" "<leader><tab>n" "<cmd>tabnew<cr>" "New Tab")
];
}

View file

@ -0,0 +1,43 @@
{ config, ... }:
{
colorschemes = {
catppuccin = {
enable = false;
settings = {
integrations.native_lsp = {
enabled = true;
underlines = {
errors = [ "undercurl" ];
hints = [ "undercurl" ];
warnings = [ "undercurl" ];
information = [ "undercurl" ];
};
};
flavor = "mocha";
italic = true;
bold = true;
dimInactive = false;
transparent_background = true;
};
};
};
colorschemes.tokyonight = {
enable = true;
settings = {
style = "night";
transparent = config.myvim.transparent;
styles = {
floats = if config.myvim.transparent then "transparent" else "dark";
sidebars = if config.myvim.transparent then "transparent" else "dark";
comments.italic = true;
functions.italic = true;
variables.italic = true;
keyword = {
italic = true;
bold = true;
};
};
};
};
}

149
plugins/common/default.nix Normal file
View file

@ -0,0 +1,149 @@
{ config, lib, ... }:
let
inherit (config.myvim) icons;
inherit (lib.nixvim) mkRaw;
in
{
imports =
with builtins;
with lib;
map (fn: ./${fn}) (
filter (fn: (fn != "default.nix" && hasSuffix ".nix" "${fn}")) (attrNames (readDir ./.))
);
luaLoader.enable = false;
extraConfigLua =
with icons.diagnostics;
# lua
''
local function my_paste(reg)
return function(lines)
local content = vim.fn.getreg('"')
return vim.split(content, '\n')
end
end
if (os.getenv('SSH_TTY') ~= nil)
then
vim.g.clipboard = {
name = 'OSC 52',
copy = {
['+'] = require('vim.ui.clipboard.osc52').copy('+'),
['*'] = require('vim.ui.clipboard.osc52').copy('*'),
},
paste = {
["+"] = my_paste("+"),
["*"] = my_paste("*"),
},
}
end
vim.opt.whichwrap:append("<>[]hl")
vim.opt.listchars:append("space:·")
-- below part set's the Diagnostic icons/colors
local signs = {
Hint = "${BoldHint}",
Info = "${BoldInformation}",
Warn = "${BoldWarning}",
Error = "${BoldError}",
}
for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
end
'';
globals = {
mapleader = config.myvim.leader;
floating_window_options.border = config.myvim.border;
};
opts = {
clipboard = "unnamedplus";
cursorline = true;
cursorlineopt = "number";
pumblend = 0;
pumheight = 10;
expandtab = true;
shiftwidth = 2;
smartindent = true;
tabstop = 2;
softtabstop = 2;
ignorecase = true;
smartcase = true;
mouse = "a";
cmdheight = 0;
number = true;
relativenumber = true;
numberwidth = 2;
ruler = false;
signcolumn = "yes";
splitbelow = true;
splitright = true;
splitkeep = "screen";
termguicolors = true;
conceallevel = 2;
undofile = true;
wrap = false;
virtualedit = "block";
winminwidth = 5;
fileencoding = "utf-8";
list = true;
smoothscroll = true;
autoread = true;
autowrite = true;
swapfile = false;
fillchars = {
eob = " ";
};
updatetime = 500;
};
autoCmd = [
{
desc = "Highlight on yank";
event = [ "TextYankPost" ];
callback =
# lua
mkRaw ''
function()
vim.highlight.on_yank()
end
'';
}
{
desc = "Check file changes";
event = [
"FocusGained"
"BufEnter"
"CursorHold"
];
pattern = [ "*" ];
callback =
# lua
mkRaw ''
function()
if vim.fn.mode() ~= "c" then
vim.cmd("checktime")
end
end
'';
}
];
extraLuaPackages = lp: with lp; [ luarocks ];
}

View file

@ -0,0 +1,40 @@
{ lib, ... }:
{
myvim.mkKey = rec {
# set of functions that returns attrs for keymap list
mkKeymap = mode: key: action: desc: {
inherit mode key action;
options = {
inherit desc;
silent = true;
noremap = true;
remap = true;
};
};
# use when no description is to be passed
mkKeymap' =
mode: key: action:
mkKeymap mode key action null;
mkKeymapWithOpts =
mode: key: action: desc: opts:
(mkKeymap mode key action desc) // { options = opts; };
# for which-key icon generation
# accepts a list of strings and returns a list of objects
# [{ __unkeyed, icon, group, hidden <optional boolean> }]
wKeyObj =
with builtins;
list:
{
__unkeyed = elemAt list 0;
icon = elemAt list 1;
group = elemAt list 2;
}
// lib.optionalAttrs (length list > 3) {
hidden = elemAt list 3;
};
};
}

185
plugins/common/icons.nix Normal file
View file

@ -0,0 +1,185 @@
{
config.myvim.icons = {
kind = {
Array = "";
Boolean = "";
Class = "";
Color = "";
Constant = "";
Constructor = "";
Enum = "";
EnumMember = "";
Event = "";
Field = "";
File = "";
Folder = "";
Function = "";
Interface = "";
Key = "";
Keyword = "";
Method = "";
Module = "";
Namespace = "";
Null = "";
Number = "";
Object = "";
Operator = "";
Package = "";
Property = "";
Reference = "";
Snippet = "";
String = "";
Struct = "";
Text = "";
TypeParameter = "";
Unit = "";
Value = "";
Variable = "";
Copilot = "";
TabNine = "";
};
git = {
LineAdded = "";
LineModified = "";
LineRemoved = "";
FileDeleted = "";
FileIgnored = "󰫙";
FileRenamed = "";
FileStaged = "";
FileUnmerged = "";
FileMerged = "";
FileUnstaged = "";
FileUntracked = "";
FileChanged = "󰉺";
Copied = "󰆏";
Ignored = "";
Diff = "";
Repo = "";
Octoface = "";
Branch = "";
};
ui = {
lazy = {
ft = "";
lazy = "󰂠 ";
loaded = "";
not_loaded = "";
};
ArrowCircleDown = "";
ArrowCircleLeft = "";
ArrowCircleRight = "";
ArrowCircleUp = "";
BoldArrowDown = "";
BoldArrowLeft = "";
BoldArrowRight = "";
BoldArrowUp = "";
BoldClose = "";
BoldDividerLeft = "";
BoldDividerRight = "";
BoldLineLeft = "";
BookMark = "";
BoxChecked = "";
Bug = "";
Stacks = "";
Scopes = "";
Watches = "";
DebugConsole = "";
Calendar = "";
Check = "";
ChevronRight = ">";
ChevronShortDown = "";
ChevronShortLeft = "";
ChevronShortRight = "";
ChevronShortUp = "";
Circle = "";
Close = "";
CloudDownload = "";
Code = "";
Comment = "";
Dashboard = "";
DividerLeft = "";
DividerRight = "";
DoubleChevronRight = "»";
Ellipsis = "";
EmptyFolder = "";
EmptyFolderOpen = "";
ExitCircle = "󰿅";
File = "";
FileSymlink = "";
Files = "";
FileRename = "";
FindFile = "󰈞";
FindText = "";
Fire = "";
Folder = "";
FolderOpen = "";
FolderSymlink = "";
Forward = "";
Gear = "";
History = "";
Lightbulb = "";
LineLeft = "";
LineMiddle = "";
List = "";
Lock = "";
NewFile = "";
Note = "";
Package = "";
Pencil = "󰏫";
Plus = "";
Project = "";
Search = "";
SignIn = "";
SignOut = "";
Tab = "";
Table = "";
Target = "󰀘";
Telescope = "";
Text = "";
Tree = "";
Triangle = "󰐊";
TriangleShortArrowDown = "";
TriangleShortArrowLeft = "";
TriangleShortArrowRight = "";
TriangleShortArrowUp = "";
};
diagnostics = {
BoldError = "";
Error = "";
BoldWarning = "";
Warning = "";
BoldInformation = "";
Information = "";
BoldQuestion = "";
Question = "";
BoldHint = "";
Hint = "󰌶";
Debug = "";
Trace = "";
};
misc = {
Robot = "";
Squirrel = "";
Tag = "";
Watch = "";
Smiley = "";
Package = "";
CircuitBoard = "";
LualineFmt = "";
};
nvtree_chad = {
default = "󰈚";
symlink = "";
folder = {
default = "";
empty = "";
empty_open = "";
open = "";
symlink = "";
symlink_open = "";
arrow_open = "";
arrow_closed = "";
};
};
};
}

309
plugins/common/mappings.nix Normal file
View file

@ -0,0 +1,309 @@
{ config, lib, ... }:
let
inherit (config.myvim.mkKey) mkKeymap mkKeymapWithOpts wKeyObj;
inherit (lib.nixvim) mkRaw;
# general mappings
v = [
(mkKeymap "v" "<c-s>" "<esc>:w<cr>" "Saving File")
(mkKeymap "v" "<c-c>" "<esc>" "Escape")
(mkKeymap "v" "<a-j>" ":m '>+1<cr>gv-gv" "Move Selected Line Down")
(mkKeymap "v" "<a-k>" ":m '<lt>-2<CR>gv-gv" "Move Selected Line Up")
(mkKeymap "v" "<" "<gv" "Indent out")
(mkKeymap "v" ">" ">gv" "Indent in")
(mkKeymap "v" "<space>" "<Nop>" "Mapped to Nothing")
];
xv = [
(mkKeymapWithOpts "x" "j" ''v:count || mode(1)[0:1] == "no" ? "j" : "gj"'' "Move down" {
expr = true;
})
(mkKeymapWithOpts "x" "k" ''v:count || mode(1)[0:1] == "no" ? "k" : "gk"'' "Move up" {
expr = true;
})
];
insert = [
(mkKeymap "i" "jk" "<esc>" "Normal Mode")
(mkKeymap "i" "<c-s>" "<esc>:w ++p<cr>" "Save file")
(mkKeymap "i" "<a-j>" "<esc>:m .+1<cr>==gi" "Move Line Down")
(mkKeymap "i" "<a-k>" "<esc>:m .-2<cr>==gi" "Move Line Up")
];
normal = [
(mkKeymap "n" "<c-a-h>" ":lua require('smart-splits').resize_left()<cr>" "Resize Left")
(mkKeymap "n" "<c-a-j>" ":lua require('smart-splits').resize_down()<cr>" "Resize Down")
(mkKeymap "n" "<c-a-k>" ":lua require('smart-splits').resize_up()<cr>" "Resize Up")
(mkKeymap "n" "<c-a-l>" ":lua require('smart-splits').resize_right()<cr>" "Resize Right")
(mkKeymap "n" "?" (
# lua
mkRaw ''
function()
require('flash').jump({
forward = true, wrap = true, multi_window = true
})
end
''
) "Flash Search")
(mkKeymap "n" "<c-h>" ":lua require('smart-splits').move_cursor_left()<cr>" "Move Cursor Left")
(mkKeymap "n" "<c-j>" ":lua require('smart-splits').move_cursor_down()<cr>" "Move Cursor Down")
(mkKeymap "n" "<c-k>" ":lua require('smart-splits').move_cursor_up()<cr>" "Move Cursor Up")
(mkKeymap "n" "<c-l>" ":lua require('smart-splits').move_cursor_right()<cr>" "Move Cursor Right")
(mkKeymap "n" "<c-\\>" ":lua require('smart-splits').move_cursor_previous()<cr>"
"Move Cursor Previous"
)
(mkKeymap "n" "<leader>dd"
(
# lua
mkRaw ''
function()
local any_diff = false
for _, w in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
if vim.api.nvim_win_get_option(w, "diff") then
any_diff = true
break
end
end
if any_diff then
vim.cmd("windo diffoff")
else
vim.cmd("windo diffthis")
end
end
''
)
"Toggle Diff the opened windows"
)
(mkKeymap "n" "<c-s>" "<cmd>w ++p<cr>" "Save the file")
(mkKeymap "n" "<a-+>" "<C-a>" "Increase Number")
(mkKeymap "n" "<a-->" "<C-x>" "Decrease Number")
(mkKeymap "n" "<a-j>" "<cmd>m .+1<cr>==" "Move line Down")
(mkKeymap "n" "<a-k>" "<cmd>m .-2<cr>==" "Move line up")
(mkKeymap "n" "<leader>qq" "<cmd>quitall!<cr>" "Quit!")
(mkKeymap "n" "<leader>qw" (
# lua
mkRaw ''
function()
local wins = vim.api.nvim_tabpage_list_wins(0)
if #wins > 1 then
local ok, err = pcall(vim.cmd, 'close')
if not ok then
vim.notify("Cannot close the last window!", vim.log.levels.WARN)
end
else
vim.notify("Cannot close the last window!", vim.log.levels.WARN)
end
end
''
) "Close Window!")
(mkKeymap "n" "<leader><leader>" "<cmd>nohl<cr>" "no highlight!")
(mkKeymap "n" "<esc>" "<esc>:nohlsearch<cr>" "escape")
(mkKeymap "n" "<leader>A" "ggVG" "select All")
(mkKeymap "n" "<leader>|" "<cmd>vsplit<cr>" "vertical split")
(mkKeymap "n" "<leader>-" "<cmd>split<cr>" "horizontal split")
# quickfix
(mkKeymap "n" "<leader>cn" "<cmd>cnext<cr>" "quickfix next")
(mkKeymap "n" "<leader>cp" "<cmd>cprev<cr>" "quickfix prev")
(mkKeymap "n" "<leader>cq" "<cmd>cclose<cr>" "quit quickfix")
(mkKeymap "n" "<leader>id" (
# lua
mkRaw ''
function()
local date = "# " .. os.date("%d-%m-%y")
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
local line = vim.api.nvim_get_current_line()
-- Insert date at cursor position
local new_line = line:sub(1, col) .. date .. line:sub(col + 1)
vim.api.nvim_set_current_line(new_line)
-- Move cursor to next line
vim.api.nvim_win_set_cursor(0, { row + 1, 0 })
end
''
) "Insert Date at cursor position")
(mkKeymap "n" "n" "nzzzv" "Move to center")
(mkKeymap "n" "N" "Nzzzv" "Moving to center")
(mkKeymap "n" "<leader>uC" (
# lua
mkRaw ''
require('stay-centered').toggle
''
) "Toggle stay-centered.nvim")
(mkKeymap "n" "<leader>ft" (
# lua
mkRaw ''
function()
vim.ui.input({ prompt = "Enter FileType: " }, function(input)
local ft = input
if not input or input == "" then
ft = vim.bo.filetype
end
vim.o.filetype = ft
end)
end
''
) "Set Filetype")
(mkKeymap "n" "<leader>o" (
# lua
mkRaw ''
function()
local word = vim.fn.expand("<cfile>") -- Gets file-like word under cursor
if word:match("^https?://") then
-- Detect OS and choose browser opener
local open_cmd
if vim.fn.has("macunix") == 1 then
open_cmd = "open"
elseif vim.fn.has("unix") == 1 then
open_cmd = "xdg-open"
elseif vim.fn.has("win32") == 1 or vim.fn.has("win64") == 1 then
open_cmd = "start"
else
print("Unsupported OS")
return
end
vim.fn.jobstart({ open_cmd, word }, { detach = true })
elseif vim.fn.filereadable(word) == 1 or vim.fn.isdirectory(word) == 1 then
-- It's a file or directory; open in current window
vim.cmd("edit " .. vim.fn.fnameescape(word))
else
print("Not a valid file or URL: " .. word)
end
end
''
) "Open")
(mkKeymapWithOpts "n" "j" ''v:count || mode(1)[0:1] == "no" ? "j" : "gj"'' "Move down" {
expr = true;
})
(mkKeymapWithOpts "n" "k" ''v:count || mode(1)[0:1] == "no" ? "k" : "gk"'' "Move up" {
expr = true;
})
];
in
{
keymaps = insert ++ normal ++ v ++ xv;
wKeyList = [
(wKeyObj [
"<leader>A"
""
""
"true"
])
(wKeyObj [
"<leader><leader>"
""
""
"true"
])
(wKeyObj [
"<leader>q"
""
"quit/session"
])
(wKeyObj [
"<leader>i"
""
"Insert"
])
(wKeyObj [
"<leader>v"
"󰩬"
"Insert"
])
(wKeyObj [
"z"
""
"fold"
])
(wKeyObj [
"g"
""
"goto"
])
(wKeyObj [
"["
""
"next"
])
(wKeyObj [
"]"
""
"prev"
])
(wKeyObj [
"<leader>u"
"󰔎"
"ui"
])
(wKeyObj [
"<leader>o"
""
"Open"
])
(wKeyObj [
"<leader>d"
""
"diff"
])
(wKeyObj [
"<leader>|"
""
"vsplit"
])
(wKeyObj [
"<leader>-"
""
"split"
])
(wKeyObj [
"<leader>c"
"󰁨"
"quickfix"
])
];
extraConfigLua = # lua
''
-- Use black hole register for 'x', 'X', 'c', 'C'
vim.api.nvim_set_keymap('n', 'x', '"_x', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'X', '"_X', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'c', '"_c', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'C', '"_C', { noremap = true, silent = true })
-- Visual mode
vim.api.nvim_set_keymap('v', 'x', '"_d', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', 'X', '"_d', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', 'c', '"_c', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', 'C', '"_c', { noremap = true, silent = true })
-- In visual mode, paste from the clipboard without overwriting it
vim.api.nvim_set_keymap("v", "p", '"_dP', { noremap = true, silent = true })
-- Only this hack works in command mode
vim.cmd([[
cnoremap <C-j> <C-n>
cnoremap <C-k> <C-p>
]])
'';
}

View file

@ -0,0 +1,46 @@
{ lib, ... }:
with lib;
{
options = {
wKeyList = mkOption {
type = types.listOf types.attrs;
};
myvim = {
mkKey = mkOption {
type = types.attrs;
default = { };
};
icons = mkOption {
type = types.attrs;
default = { };
};
leader = mkOption {
description = "The leader key for nvim.";
type = types.str;
default = " ";
};
border = mkOption {
description = "The border style for nvim.";
type = types.enum [
"single"
"double"
"rounded"
"solid"
"shadow"
"curved"
"bold"
"none"
];
default = "rounded";
};
transparent = mkEnableOption "transparent" // {
default = true;
};
};
};
}

View file

@ -0,0 +1,52 @@
{ pkgs, config, ... }:
let
inherit (config.myvim.mkKey) mkKeymap;
in
{
extraPlugins = with pkgs.vimPlugins; [
stay-centered-nvim
];
plugins = {
comment = {
enable = true;
settings = {
toggler.line = "<leader>/";
opleader.line = "<leader>/";
};
};
flash = {
enable = true;
settings = {
modes.char.enabled = false;
};
};
lz-n.enable = true;
nvim-autopairs.enable = true;
nvim-surround.enable = true;
smart-splits.enable = true;
trim.enable = true;
visual-multi.enable = true;
web-devicons.enable = true;
which-key = {
enable = true;
settings = {
spec = config.wKeyList;
preset = "helix";
};
};
};
opts = {
timeout = true;
timeoutlen = 250;
};
keymaps = [
(mkKeymap "n" "<leader>vt" "<cmd>:lua require('flash').treesitter()<cr>" "Select Treesitter Node")
(mkKeymap "n" "<leader>ut" ":TrimToggle<cr>" "Toggle Trim")
];
}

33
plugins/default.nix Normal file
View file

@ -0,0 +1,33 @@
{ lib, ... }:
let
mapAttrsMaybe =
f: attrs:
lib.pipe attrs [
(lib.mapAttrsToList f)
(builtins.filter (x: x != null))
builtins.listToAttrs
];
forAllNixFiles =
dir: f:
if builtins.pathExists dir then
lib.pipe dir [
builtins.readDir
(mapAttrsMaybe (
fn: type:
if type == "regular" then
let
name = lib.removeSuffix ".nix" fn;
in
lib.nameValuePair name (f "${dir}/${fn}")
else if type == "directory" && builtins.pathExists "${dir}/${fn}/default.nix" then
lib.nameValuePair fn (f "${dir}/${fn}")
else
null
))
]
else
{ };
in
{
flake.myvimPlugins = forAllNixFiles ./. (fn: fn);
}

150
plugins/git.nix Normal file
View file

@ -0,0 +1,150 @@
{ config, lib, ... }:
let
inherit (lib.nixvim) mkRaw;
inherit (config.myvim) icons;
inherit (config.myvim.mkKey) mkKeymap wKeyObj;
in
{
plugins = {
git-conflict = {
enable = true;
settings.default_mappings = true;
};
gitsigns = {
enable = true;
settings = {
current_line_blame = true;
preview_config = {
border = "rounded";
};
signs = with icons.ui; {
add.text = "${LineLeft}";
change.text = "${LineLeft}";
delete.text = "${LineLeft}";
topdelete.text = "${Triangle}";
changedelete.text = "${BoldLineLeft}";
};
};
};
};
wKeyList = [
(wKeyObj [
"<leader>g"
""
"git"
])
(wKeyObj [
"<leader>gh"
"󰫅"
"hunks"
])
(wKeyObj [
"<leader>gb"
"󰭐"
"blame"
])
];
keymaps = [
# Navigation
(mkKeymap "n" "]h" (
# lua
mkRaw ''
function ()
if vim.wo.diff then
vim.cmd.normal ({ ' ]c', bang = true})
else
require('gitsigns').nav_hunk('next')
end
end
''
) "Next Hunk")
(mkKeymap "n" "[h" (
# lua
mkRaw ''
function()
if vim.wo.diff then
vim.cmd.normal({'[c', bang = true})
else
require('gitsigns').nav_hunk('prev')
end
end
''
) "Prev Hunk")
(mkKeymap "n" "]H" (mkRaw "function() require('gitsigns').nav_hunk('last') end") "Last Hunk")
(mkKeymap "n" "[H" (mkRaw "function() require('gitsigns').nav_hunk('first') end") "First Hunk")
# Stage / Reset
(mkKeymap "n" "<leader>gs" "<cmd>lua require('gitsigns').stage_buffer()<CR>" "Stage Buffer")
(mkKeymap "v" "<leader>gs" (
# lua
mkRaw ''
function()
require('gitsigns').stage_hunk({ vim.fn.line('.'), vim.fn.line('v') })
end
''
) "Stage/Unstage Selection")
(mkKeymap "n" "<leader>gr" "<cmd>lua require('gitsigns').reset_buffer()<CR>" "Reset Buffer")
(mkKeymap "v" "<leader>gr" (
# lua
mkRaw ''
function()
require('gitsigns').reset_hunk({ vim.fn.line('.'), vim.fn.line('v') })
end
''
) "Reset Selection")
# Undo
(mkKeymap "n" "<leader>gu" "<cmd>lua require('gitsigns').undo_stage_hunk()<CR>" "Undo Stage Hunk")
# Preview / Diff
(mkKeymap "n" "<leader>gp" "<cmd>lua require('gitsigns').preview_hunk_inline()<CR>"
"Preview Hunk Inline"
)
(mkKeymap "n" "<leader>gP" "<cmd>lua require('gitsigns').preview_hunk()<CR>" "Preview Hunk (Popup)")
(mkKeymap "v" "<leader>gp" (
# lua
mkRaw ''
function()
require('gitsigns').preview_hunk_inline({ vim.fn.line('.'), vim.fn.line('v') })
end
''
) "Preview Selection")
(mkKeymap "n" "<leader>dg" "<cmd>lua require('gitsigns').diffthis()<CR>" "Git Diff ")
(mkKeymap "n" "<leader>dG" (mkRaw "function() require('gitsigns').diffthis('~') end")
"Git diff last commit (HEAD~)"
)
# Blame
(mkKeymap "n" "<leader>gk" (mkRaw "function() require('gitsigns').blame_line({ full = true }) end")
"Blame Line (Full)"
)
(mkKeymap "n" "<leader>gK" ":lua require('gitsigns').blame()<CR>" "Blame File")
# Quickfix
(mkKeymap "n" "<leader>gq" ":lua require('gitsigns').setqflist()<CR>" "Hunks to Quickfix")
(mkKeymap "n" "<leader>gQ" (mkRaw "function() require('gitsigns').setqflist('all') end")
"All Hunks to Quickfix"
)
# Toggles
(mkKeymap "n" "<leader>gb" "<cmd>lua require('gitsigns').toggle_current_line_blame()<CR>"
"Toggle Blame (Line)"
)
(mkKeymap "n" "<leader>gw" "<cmd>lua require('gitsigns').toggle_word_diff()<CR>" "Toggle Word Diff")
# Text object
(mkKeymap "o" "ih" ":<C-U>Gitsigns select_hunk<CR>" "Select Hunk")
(mkKeymap "x" "ih" ":<C-U>Gitsigns select_hunk<CR>" "Select Hunk")
];
}

9
plugins/lang/default.nix Normal file
View file

@ -0,0 +1,9 @@
{ lib, ... }:
{
imports =
with builtins;
with lib;
map (fn: ./${fn}) (
filter (fn: (fn != "default.nix" && !hasSuffix ".md" "${fn}")) (attrNames (readDir ./.))
);
}

13
plugins/lang/nix.nix Normal file
View file

@ -0,0 +1,13 @@
{
plugins = {
lsp.servers = {
nil_ls = {
enable = true;
};
statix = {
enable = true;
};
};
};
}

21
plugins/lsp/conform.nix Normal file
View file

@ -0,0 +1,21 @@
# formatter with lsp fallback
{ lib, pkgs, ... }:
{
plugins.conform-nvim = {
enable = true;
settings = {
default_format_opts.lsp_format = "prefer";
formatters_by_ft = {
"_" = [
"squeeze_blanks"
"trim_whitespace"
"trim_newlines"
];
};
formatters.squeeze_blanks.command = lib.getExe' pkgs.coreutils "cat";
};
};
}

108
plugins/lsp/default.nix Normal file
View file

@ -0,0 +1,108 @@
{ config, lib, ... }:
let
inherit (config.myvim.mkKey) mkKeymap;
in
{
opts = {
foldcolumn = "1";
foldlevel = 99;
foldlevelstart = -1;
foldenable = true;
};
diagnostic.settings = {
virtual_text = false;
underline = true;
signs = true;
severity_sort = true;
float = {
border = config.myvim.border;
source = "always";
focusable = false;
};
};
plugins = {
lsp = {
enable = true;
keymaps.extra = [
(mkKeymap "n" "<leader>lO" "<cmd>lua require('otter').activate()<cr>" "Force Otter")
];
inlayHints = true;
servers = {
typos_lsp = {
enable = true;
extraOptions.init_options.diagnosticSeverity = "Hint";
};
};
keymaps = {
silent = true;
diagnostic = {
"<leader>lj" = "goto_next";
"<leader>lk" = "goto_prev";
};
};
};
lspsaga = {
enable = true;
settings = {
lightbulb = {
enable = false;
virtualText = false;
};
outline.keys.jump = "<cr>";
ui.bortder = config.myvim.border;
scrollPreview = {
scrollDown = "<c-d>";
scrollUp = "<c-u>";
};
};
};
nvim-ufo = {
enable = true;
settings = {
provider_selector = # lua
''
function()
return { "lsp", "indent" }
end
'';
preview.mappings = {
close = "q";
switch = "K";
};
};
};
otter = {
enable = true;
settings.buffers = {
set_filetype = true;
};
};
tiny-inline-diagnostic.enable = true;
trouble.enable = true;
};
imports =
with builtins;
with lib;
map (fn: ./${fn}) (
filter (fn: (fn != "default.nix" && !hasSuffix ".md" "${fn}")) (attrNames (readDir ./.))
);
}

120
plugins/lsp/mappings.nix Normal file
View file

@ -0,0 +1,120 @@
{ config, lib, ... }:
let
inherit (lib.nixvim) mkRaw;
inherit (config.myvim.mkKey) mkKeymap wKeyObj;
in
{
wKeyList = [
(wKeyObj [
"<leader>lg"
""
"goto"
])
(wKeyObj [
"<leader>l"
"󰿘"
"lsp"
])
];
plugins.lsp.keymaps.extra = [
(mkKeymap "n" "<leader>lO" "<cmd>lua require('otter').activate()<cr>" "Force Otter")
# Lspsaga
(mkKeymap "n" "<leader>la" "<cmd>:Lspsaga code_action<cr>" "Code Action")
(mkKeymap "n" "<leader>lo" "<cmd>Lspsaga outline<cr>" "Outline")
(mkKeymap "n" "<leader>lw" "<cmd>Lspsaga show_workspace_diagnostics<cr>" "Workspace Diagnostics")
(mkKeymap "n" "gd" "<cmd>Lspsaga goto_definition<cr>" "Definitions")
(mkKeymap "n" "<leader>lr" "<cmd>Lspsaga rename ++project<cr>" "Rename")
(mkKeymap "n" "gt" "<cmd>Lspsaga goto_type_definition<cr>" "Type Definitions")
(mkKeymap "n" "<leader>l." "<cmd>Lspsaga show_line_diagnostics<cr>" "Line Diagnostics")
(mkKeymap "n" "gpd" "<cmd>Lspsaga peek_definition<cr>" "Peek Definition")
(mkKeymap "n" "gpt" "<cmd>Lspsaga peek_type_definition<cr>" "Peek Type Definition")
(mkKeymap "n" "[e" "<cmd>Lspsaga diagnostic_jump_prev<cr>" "Jump Prev Diagnostic")
(mkKeymap "n" "]e" "<cmd>Lspsaga diagnostic_jump_next<cr>" "Jump Next Diagnostic")
(mkKeymap "n" "K" (mkRaw ''
function()
local ok, ufo = pcall(require, "ufo")
if ok then
winid = ufo.peekFoldedLinesUnderCursor()
end
if not winid then
vim.cmd("Lspsaga hover_doc")
end
end
'') "Hover Doc")
# UFO
(mkKeymap "n" "zR" (
# lua
mkRaw ''
function()
require("ufo").openAllFolds()
end
''
) "Open all folds")
(mkKeymap "n" "zM" (
# lua
mkRaw ''
function()
require("ufo").closeAllFolds()
end
''
) "Close All Folds")
(mkKeymap "n" "zK" (
# lua
mkRaw ''
function()
local winid = require("ufo").peekFoldedLinesUnderCursor()
if not winid then
vim.lsp.buf.hover()
end
end
''
) "Peek Folded Lines")
(mkKeymap "n" "<leader>lq" "<CMD>LspStop<Enter>" "Stop LSP")
(mkKeymap "n" "<leader>li" "<cmd>LspInfo<cr>" "LSP Info")
(mkKeymap "n" "<leader>ls" "<CMD>LspStart<Enter>" "Start LSP")
(mkKeymap "n" "<leader>lR" "<CMD>LspRestart<Enter>" "Restart LSP")
(mkKeymap "n" "<C-s-k>" "<cmd>:lua vim.lsp.buf.signature_help()<cr>" "Signature Help")
(mkKeymap "n" "<leader>lD" "<cmd>:lua Snacks.picker.lsp_definitions()<cr>" "Definitions list")
(mkKeymap "n" "<leader>ls" "<cmd>:lua Snacks.picker.lsp_symbols()<cr>" "Definitions list")
(mkKeymap "n" "<leader>lf" "<cmd>:lua require('conform').format()<cr>" "Format file")
(mkKeymap "x" "<leader>lf" "<cmd>:lua require('conform').format()<cr>" "Format File")
(mkKeymap "v" "<leader>lf" "<cmd>:lua require('conform').format()<cr>" "Format File")
(mkKeymap "n" "[d" "<cmd>:lua vim.diagnostic.goto_prev()<cr>" "Previous Diagnostic")
(mkKeymap "n" "]d" "<cmd>:lua vim.diagnostic.goto_next()<cr>" "Next Diagnostic")
(mkKeymap "n" "<leader>lL" (
# lua
mkRaw ''
function()
if vim.g.diagnostics_visible == nil or vim.g.diagnostics_visible then
vim.g.diagnostics_visible = false
vim.diagnostic.disable()
else
vim.g.diagnostics_visible = true
vim.diagnostic.enable()
end
end
''
) "Toggle Diagnostics")
(mkKeymap "n" "<leader>ll" (
# lua
mkRaw ''
function()
if vim.diagnostic.config().virtual_text == false then
vim.diagnostic.config({ virtual_text = { source = "always" } })
else
vim.diagnostic.config({ virtual_text = false })
end
end
''
) "Toggle Virtual Text")
];
}

View file

@ -0,0 +1,54 @@
{ lib, ... }:
{
extraConfigLua = # lua
''
vim.cmd([[hi StatusLine guibg=NONE ctermbg=NONE]])
'';
plugins.lualine = {
enable = true;
settings =
let
separators = {
left = "";
right = "";
};
transparent = {
a.fg = "none";
c.bg = "none";
};
in
{
options = {
theme = {
normal = transparent;
insert = transparent;
visual = transparent;
replace = transparent;
command = transparent;
inactive = transparent;
};
always_divide_middle = true;
globalstatus = true;
icons_enable = true;
component_separators = separators;
section_separatros = separators;
disabled_filetypes = [
"Outline"
"neo-tree"
"dashboard"
"snacks_dashboard"
"snacks_terminal"
];
};
};
};
imports =
with builtins;
with lib;
map (fn: ./${fn}) (
filter (fn: (fn != "default.nix" && !hasSuffix ".md" "${fn}")) (attrNames (readDir ./.))
);
}

View file

@ -0,0 +1,150 @@
{ config, lib, ... }:
let
inherit (config.myvim) icons;
inherit (lib.nixvim) mkRaw;
in
{
plugins.lualine.settings.sections = {
lualine_a = [
{
__unkeyed = "fileformat";
cond = null;
padding = {
left = 1;
right = 1;
};
color = "SLGreen";
}
];
lualine_b = [ "encoding" ];
lualine_c = [
{
__unkeyed = "b:gitsigns_head";
icon = "${icons.git.Branch}";
color.gui = "bold";
}
{
__unkeyed = "diff";
source =
# lua
mkRaw ''
(function()
local gitsigns = vim.b.gitsigns_status_dict
if vim.b.gitsigns_status_dict then
return {
added = gitsigns.added,
modified = gitsigns.changed,
removed = gitsigns.removed,
}
end
end)
'';
symbols = {
added = mkRaw ''"${icons.git.LineAdded}" .. " " '';
modified = mkRaw ''"${icons.git.LineModified}".. " "'';
removed = mkRaw ''"${icons.git.LineRemoved}".. " "'';
};
}
{
__unkeyed = "diagnostics";
sources = {
__unkeyed = "nvim_diagnostic";
};
symbols = {
error = mkRaw ''"${icons.diagnostics.BoldError}" .. " "'';
warn = mkRaw ''"${icons.diagnostics.BoldWarning}" .. " "'';
info = mkRaw ''"${icons.diagnostics.BoldInformation}" .. " "'';
hint = mkRaw ''"${icons.diagnostics.BoldHint}" .. " "'';
};
}
];
lualine_x = [
{
color = {
fg = "#ff9e64";
};
cond = mkRaw ''
function()
local ok, noice = pcall(require, "noice")
if not ok then
return false
end
return noice.api.status.mode.has()
end
'';
__unkeyed =
# lua
mkRaw ''
function()
local ok, noice = pcall(require, "noice")
if not ok then
return false
end
return noice.api.status.mode.get()
end
'';
}
{
__unkeyed =
# lua
mkRaw ''
function()
local clients = vim.lsp.get_clients()
local lsp_names = {}
if next(clients) == nil then
return "Ls Inactive"
end
for _, client in ipairs(clients) do
if client.name ~= "copilot" and client.name ~= "null-ls" and client.name ~= "typos_lsp" then
local name = client.name:gsub("%[%d+%]", "") -- makes otter-ls[number] -> otter-ls
table.insert(lsp_names, name)
end
end
local formatters = require("conform").list_formatters()
local con_names = {}
for _, formatter in ipairs(formatters) do
local name = formatter.name
if formatter.available and (name ~= "squeeze_blanks" and name ~= "trim_whitespace" and name ~= "trim_newlines") then
table.insert(con_names, formatter.name)
end
end
local names = {}
vim.list_extend(names, lsp_names)
vim.list_extend(names, con_names)
return "[" .. table.concat(vim.fn.uniq(names), ", ") .. "]"
end
'';
}
{
__unkeyed = "filetype";
cond = null;
padding = {
left = 1;
right = 1;
};
}
];
lualine_y = [ "progress" ];
lualine_z = [
"location"
{
__unkeyed =
# lua
mkRaw ''
function()
local lsp_clients = vim.lsp.get_clients()
for _, client in ipairs(lsp_clients) do
if client.name == "copilot" then
return "%#SLGreen#" .. "${icons.kind.Copilot}"
end
end
return ""
end
'';
}
];
};
}

63
plugins/noice.nix Normal file
View file

@ -0,0 +1,63 @@
{
plugins.noice = {
enable = true;
settings = {
presets.bottom_search = true;
routes = [
# FIXME: <https://github.com/folke/noice.nvim/issues/1097>
{
filter = {
event = "msg_show";
kind = [ "shell_out" ];
};
view = "notify";
opts = {
level = "info";
title = "stdout";
};
}
{
filter = {
event = "msg_show";
kind = [ "shell_err" ];
};
view = "notify";
opts = {
level = "error";
title = "stderr";
};
}
];
views = {
cmdline_popup = {
position = {
row = -2;
col = "50%";
};
};
cmdline_popupmenu = {
position = {
row = -5;
col = "50%";
};
};
};
lsp = {
override = {
"vim.lsp.util.convert_input_to_markdown_lines" = true;
"vim.lsp.util.stylize_markdown" = true;
"cmp.entry.get_documentation" = true;
};
hover.enabled = false;
message.enabled = false;
signature.enabled = false;
progress.eabled = false;
};
};
};
}

323
plugins/snacks/default.nix Normal file
View file

@ -0,0 +1,323 @@
{ lib, pkgs, ... }:
let
inherit (lib.nixvim) utils mkRaw;
in
{
plugins = {
neoscroll.enable = true;
todo-comments.enable = true;
snacks = {
enable = true;
settings = {
bigfile.enabled = true;
dim.enabled = true;
scroll.enabled = false;
lazygit.config.os.edit =
# lua
mkRaw ''
'[ -z "\"$NVIM\"" ] && (nvim -- {{filename}}) || (nvim --server "\"$NVIM\"" --remote-send "\"q\"" && nvim --server "\"$NVIM\"" --remote {{filename}})'
'';
quickfile.enbled = true;
indent.enabled = true;
words.enabled = true;
statuscolumn.enabled = true;
dashboard = {
enabled = true;
sections =
# lua
mkRaw ''
{
{ section = "header" },
{
pane = 2,
section = "terminal",
cmd = "colorscript -e square",
height = 5,
padding = 1,
},
{ section = "keys", gap = 1, padding = 1 },
{
pane = 2,
icon = " ",
desc = "Browse Repo",
padding = 1,
key = "b",
action = function()
Snacks.gitbrowse()
end,
},
function()
local in_git = Snacks.git.get_root() ~= nil
local cmds = {
{
title = "Notifications",
cmd = "gh notify -s -a -n5",
action = function()
vim.ui.open("https://github.com/notifications")
end,
key = "n",
icon = " ",
height = 5,
enabled = true,
},
{
title = "Open Issues",
cmd = "gh issue list -L 3",
key = "i",
action = function()
vim.fn.jobstart("gh issue list --web", { detach = true })
end,
icon = " ",
height = 7,
},
{
icon = " ",
title = "Open PRs",
cmd = "gh pr list -L 3",
key = "P",
action = function()
vim.fn.jobstart("gh pr list --web", { detach = true })
end,
height = 7,
},
{
icon = " ",
title = "Git Status",
cmd = "git --no-pager diff --stat -B -M -C",
height = 10,
},
}
return vim.tbl_map(function(cmd)
return vim.tbl_extend("force", {
pane = 2,
section = "terminal",
enabled = in_git,
padding = 1,
ttl = 5 * 60,
indent = 3,
}, cmd)
end, cmds)
end,
-- { section = "startup" },
}
'';
};
picker =
let
keys = {
"<c-d>" = (utils.listToUnkeyedAttrs [ "preview_scroll_down" ]) // {
mode = "n";
};
"<c-u>" = (utils.listToUnkeyedAttrs [ "preview_scroll_up" ]) // {
mode = "n";
};
"-" = (utils.listToUnkeyedAttrs [ "edit_split" ]) // {
mode = "n";
};
"|" = (utils.listToUnkeyedAttrs [ "edit_vsplit" ]) // {
mode = "n";
};
"<cr>" =
# lua
mkRaw ''
{ { "pick_win", "jump" } }
'';
};
in
{
enabled = true;
actions.pick_win =
# lua FIXME: on non overridden theme the picker window opens buffer with bg
mkRaw ''
function(picker)
if not picker.layout.split then
picker.layout:hide()
end
local win = Snacks.picker.util.pick_win {
main = picker.main,
float = false,
filter = function(_, buf)
local ft = vim.bo[buf].ft
return ft == 'snacks_dashboard' or not ft:find '^snacks'
end,
}
if not win then
if not picker.layout.split then
picker.layout:unhide()
end
return true
end
picker.main = win
if not picker.layout.split then
vim.defer_fn(function()
if not picker.closed then
picker.layout:unhide()
end
end, 100)
end
end
'';
sources.explorer =
# lua
mkRaw ''
{
on_show = function(picker)
local show = false
local gap = 1
local clamp_width = function(value)
return math.max(20, math.min(100, value))
end
--
local position = picker.resolved_layout.layout.position
local rel = picker.layout.root
local update = function(win) ---@param win snacks.win
local border = win:border_size().left + win:border_size().right
win.opts.row = vim.api.nvim_win_get_position(rel.win)[1]
win.opts.height = 0.8
if position == 'left' then
win.opts.col = vim.api.nvim_win_get_width(rel.win) + gap
win.opts.width = clamp_width(vim.o.columns - border - win.opts.col)
end
if position == 'right' then
win.opts.col = -vim.api.nvim_win_get_width(rel.win) - gap
win.opts.width = clamp_width(vim.o.columns - border + win.opts.col)
end
win:update()
end
local preview_win = Snacks.win.new {
relative = 'editor',
external = false,
focusable = false,
border = 'rounded',
backdrop = false,
show = show,
bo = {
filetype = 'snacks_float_preview',
buftype = 'nofile',
buflisted = false,
swapfile = false,
undofile = false,
},
on_win = function(win)
update(win)
picker:show_preview()
end,
}
rel:on('WinLeave', function()
vim.schedule(function()
if not picker:is_focused() then
picker.preview.win:close()
end
end)
end)
rel:on('WinResized', function()
update(preview_win)
end)
picker.preview.win = preview_win
picker.main = preview_win.win
end,
on_close = function(picker)
picker.preview.win:close()
end,
layout = {
preset = 'sidebar',
layout = {
backdrop = false,
width = 40, -- Pfff.. 40. I have 60!
min_width = 40,
height = 0,
position = 'right',
border = 'none',
box = 'vertical',
{ win = 'list', border = 'none' },
{ win = 'preview', title = '{preview}', height = 0.4, border = 'top' },
},
preview = false, ---@diagnostic disable-line
},
actions = {
toggle_preview = function(picker) --[[Override]]
picker.preview.win:toggle()
end,
},
}
'';
win = {
input.keys = keys;
list.keys = keys;
};
};
image = {
enabled = true;
border = "none";
doc.inline = false;
};
notifier = {
enabled = true;
style = "minimal";
top_down = false;
};
};
};
};
extraPackages = with pkgs; [
gh
imagemagick
ghostscript_headless
tectonic
mermaid-cli
dwt1-shell-color-scripts
]; # for image support
autoCmd = [
{
desc = "Pre init Function";
event = [ "VimEnter" ];
callback =
# lua
mkRaw ''
-- Taken from https://github.com/folke/snacks.nvim?tab=readme-ov-file#-usage
function()
-- Setup some globals for debugging (lazy-loaded)
_G.dd = function (...)
Snacks.debug.inspect
(...)
end
_G.bt = function()
Snacks.debug.backtrace()
end
vim.print = _G.dd -- Override print to use snacks for `:=` command
-- Create some toggle mappings
Snacks.toggle.diagnostics():map("<leader>ud")
Snacks.toggle.line_number():map("<leader>ul")
Snacks.toggle.inlay_hints():map("<leader>uh")
Snacks.toggle.treesitter():map("<leader>uT")
Snacks.toggle.option("spell",
{ name = "Spelling" }):map("<leader>us")
Snacks.toggle.option("wrap",
{ name = "Wrap" }):map("<leader>uw")
Snacks.toggle.option("relativenumber",
{ name = "Relative Number" }):map("<leader>uL")
Snacks.toggle.option("conceallevel",
{ off = 0, on = vim.o.conceallevel > 0 and vim.o.conceallevel or 2 }):map("<leader>uc")
Snacks.toggle.option("background",
{ off = "light", on = "dark", name = "Dark Background" }):map("<leader>ub")
end
'';
}
];
imports =
with builtins;
with lib;
map (fn: ./${fn}) (
filter (fn: (fn != "default.nix" && !hasSuffix ".md" "${fn}")) (attrNames (readDir ./.))
);
}

126
plugins/snacks/mappings.nix Normal file
View file

@ -0,0 +1,126 @@
{ config, lib, ... }:
let
inherit (lib.nixvim) mkRaw;
inherit (config.myvim.mkKey) mkKeymap wKeyObj;
in
{
wKeyList = [
(wKeyObj [
"<leader>."
""
"Scratch Buffer"
])
(wKeyObj [
"<leader>:"
""
""
true
])
(wKeyObj [
"<leader>s"
""
"search"
])
(wKeyObj [
"<leader>f"
""
"file/find"
])
(wKeyObj [
"<leader>e"
"󰙅"
"Explorer"
])
];
keymaps = [
(mkKeymap "n" "<leader>e" "<cmd>:lua Snacks.explorer()<cr>" "Explorer")
(mkKeymap "n" "<leader>.." "<cmd>:lua Snacks.scratch()<cr>" "Toggle Scratch Buffer")
(mkKeymap "n" "<leader>.s" "<cmd>:lua Snacks.scratch.select()<cr>" "Select Scratch Buffer")
(mkKeymap "n" "<leader>sn" "<cmd>:lua Snacks.notifier.show_history()<cr>" "Notification History")
(mkKeymap "n" "<leader>.r" "<cmd>:lua Snacks.rename.rename_file()<cr>" "Rename file/variable +lsp")
(mkKeymap "n" "<leader>gB" "<cmd>:lua Snacks.gitbrowse()<cr>" "Git Browse")
(mkKeymap "n" "<leader>gf" "<cmd>:lua Snacks.lazygit.log_file()<cr>" "Lazygit Current File History")
(mkKeymap "n" "<leader>gB" "<cmd>:lua Snacks.gitbrowse()<cr>" "Git Browse")
(mkKeymap "n" "<leader>gf" "<cmd>:lua Snacks.lazygit.log_file()<cr>" "Lazygit Current File History")
(mkKeymap "n" "<leader>gg" "<cmd>:lua Snacks.lazygit()<cr>" "Lazygit")
(mkKeymap "n" "<leader>gl" "<cmd>:lua Snacks.lazygit.log()<cr>" "Lazygit Log (cwd)")
(mkKeymap "n" "<leader>gL" "<cmd>:lua Snacks.picker.git_log()<cr>" "Git Log (cwd)")
(mkKeymap "n" "<leader>un" "<cmd>:lua Snacks.notifier.hide()<cr>" "Dismiss All Notifications")
(mkKeymap "n" "<leader>sb" "<cmd>:lua Snacks.picker.lines() <cr>" "Buffer Lines")
(mkKeymap "n" "<leader>sB" "<cmd>:lua Snacks.picker.grep_buffers() <cr>" "Grep Open Buffers")
(mkKeymap "n" "<leader>sg" "<cmd>:lua Snacks.picker.grep() <cr>" "Grep")
(mkKeymap "n" "<leader>sw" "<cmd>:lua Snacks.picker.grep_word() <cr>" "Visual selection or word")
(mkKeymap "x" "<leader>sw" "<cmd>:lua Snacks.picker.grep_word() <cr>" "Visual selection or word")
(mkKeymap "n" ''<leader>s"'' "<cmd>:lua Snacks.picker.registers() <cr>" "Registers")
(mkKeymap "n" "<leader>sa" "<cmd>:lua Snacks.picker.autocmds() <cr>" "Autocmds")
(mkKeymap "n" "<leader>sb" "<cmd>:lua Snacks.picker.lines() <cr>" "Buffer Lines")
(mkKeymap "n" "<leader>sc" "<cmd>:lua Snacks.picker.command_history() <cr>" "Command History")
(mkKeymap "n" "<leader>sC" "<cmd>:lua Snacks.picker.commands() <cr>" "Commands")
(mkKeymap "n" "<leader>sd" "<cmd>:lua Snacks.picker.diagnostics() <cr>" "Diagnostics")
(mkKeymap "n" "<leader>sD" "<cmd>:lua Snacks.picker.diagnostics_buffer() <cr>" "Buffer Diagnostics")
(mkKeymap "n" "<leader>sH" "<cmd>:lua Snacks.picker.highlights() <cr>" "Highlights")
(mkKeymap "n" "<leader>si" "<cmd>:lua Snacks.picker.icons() <cr>" "Icons")
(mkKeymap "n" "<leader>sj" "<cmd>:lua Snacks.picker.jumps() <cr>" "Jumps")
(mkKeymap "n" "<leader>sl" "<cmd>:lua Snacks.picker.loclist() <cr>" "Location List")
(mkKeymap "n" "<leader>sm" "<cmd>:lua Snacks.picker.marks() <cr>" "Marks")
(mkKeymap "n" "<leader>sM" "<cmd>:lua Snacks.picker.man() <cr>" "Man Pages")
(mkKeymap "n" "<leader>sq" "<cmd>:lua Snacks.picker.qflist() <cr>" "Quickfix List")
(mkKeymap "n" "<leader>sR" "<cmd>:lua Snacks.picker.resume() <cr>" "Resume")
(mkKeymap "n" "<leader>su" "<cmd>:lua Snacks.picker.undo() <cr>" "Undo History")
(mkKeymap "n" "gd" "<cmd>:lua Snacks.picker.lsp_definitions() <cr>" "Goto Definition")
(mkKeymap "n" "gD" "<cmd>:lua Snacks.picker.lsp_declarations() <cr>" "Goto Declaration")
(mkKeymap "n" "gr" "<cmd>:lua Snacks.picker.lsp_references() <cr>" "References")
(mkKeymap "n" "gI" "<cmd>:lua Snacks.picker.lsp_implementations() <cr>" "Goto Implementation")
(mkKeymap "n" "gy" "<cmd>:lua Snacks.picker.lsp_type_definitions() <cr>" "Goto T[y]pe Definition")
(mkKeymap "n" "<leader>ss" "<cmd>:lua Snacks.picker.lsp_symbols() <cr>" "LSP Symbols")
(mkKeymap "n" "<leader>sS" "<cmd>:lua Snacks.picker.lsp_workspace_symbols() <cr>"
"LSP Workspace Symbols"
)
# Telescope replacement
(mkKeymap "n" "<leader>sP" "<cmd>:lua Snacks.picker()<cr>" "Pickers")
(mkKeymap "n" "<leader>ss" "<cmd>:lua Snacks.picker.smart()<cr>" "Smart")
(mkKeymap "n" "<leader>st" "<cmd>:lua Snacks.picker.todo_comments({layout = 'ivy'})<cr>" "Todo")
(mkKeymap "n" "<leader>sT"
''<cmd>:lua Snacks.picker.todo_comments({keywords = {"TODO", "FIX", "FIXME"}, layout = 'ivy'})<cr>''
"Todo"
)
(mkKeymap "n" "<leader>s:" ''<cmd>:lua Snacks.picker.command_history({ layout = 'ivy'})<cr>''
"Command History"
)
(mkKeymap "n" "<leader>s," "<cmd>:lua Snacks.picker.buffers({layout = 'ivy'})<cr>" "Buffers")
(mkKeymap "n" "<leader>sh" ''<cmd>:lua Snacks.picker.help()<cr>'' "Help Pages")
(mkKeymap "n" "<leader>sk" ''<cmd>:lua Snacks.picker.keymaps({layout = 'vscode'})<cr>'' "Keymaps")
(mkKeymap "n" "<leader>su" (
# lua
mkRaw ''
function()
Snacks.picker.undo({
win = {
input = {
keys = {
["y"] = { "yank_add", mode = "n" },
["Y"] = { "yank_del", mode = "n" },
},
},
},
})
end
''
) "Undo")
(mkKeymap "n" "<leader>ff" "<cmd>:lua Snacks.picker.files()<cr>" "Find Files")
(mkKeymap "n" "<leader>fF" "<cmd>:lua Snacks.picker.smart()<cr>" "Smart")
(mkKeymap "n" "<leader>f/" "<cmd>:lua Snacks.picker.grep()<cr>" "Grep")
(mkKeymap "n" "<leader>f?"
"<cmd>:lua Snacks.picker.grep({layout = 'ivy', args = { '--vimgrep', '--smart-case', '--fixed-strings' } })<cr>"
"Grep"
)
(mkKeymap "n" "<leader>fr" "<cmd>:lua Snacks.picker.recent()<cr>" "Recent")
(mkKeymap "n" "<leader>fp" "<cmd>:lua Snacks.picker.projects()<cr>" "Projects")
];
}

36
plugins/treesitter.nix Normal file
View file

@ -0,0 +1,36 @@
{
plugins = {
mini-ai.enable = true;
sleuth.enable = true;
treesitter = {
enable = true;
settings = {
highlight = {
enable = true;
disable = [
"latex"
"markdown"
];
};
auto_install = true;
indent_enable = true;
folding = true;
autoLoad = true;
incemental_selection.enable = true;
};
};
treesitter-context = {
enable = true;
settings = {
max_lines = 4;
min_window_height = 40;
};
};
};
}

64
plugins/ux.nix Normal file
View file

@ -0,0 +1,64 @@
{ pkgs, config, ... }:
{
extraPlugins = [
pkgs.vimPlugins.windows-nvim
];
extraConfigLua = ''
vim.o.winwidth = 10
vim.o.winminwidth = 10
vim.o.equalalways = false
require('windows').setup({
ignore = {
filetype = { "snacks_picker_list", "snacks_layout_box" },
},
})
'';
plugins = {
colorizer = {
enable = true;
settings = {
filetypes = {
__unkeyed = "*";
};
user_default_options = {
names = true;
RRGGBBAA = true;
AARRGGBB = true;
rgb_fn = true;
hsl_fn = true;
css = true;
css_fn = true;
tailwind = true;
mode = "virtualtext";
virtualtext = "";
always_update = true;
};
};
};
dressing = {
enable = true;
settings.input.mappings.n = {
"q" = "Close";
"k" = "HistoryPrev";
"j" = "HistoryNext";
};
};
fidget = {
enable = true;
settings = {
progress.display.progress_icon = [ "moon" ];
notification.window = {
relative = "editor";
winblend = 0;
border = "none";
};
};
};
lastplace.enable = true;
};
}