wip
Signed-off-by: Lander Van den Bulcke <landervandenbulcke@gmail.com>
This commit is contained in:
parent
ff2c59724a
commit
5c5c106495
29 changed files with 2445 additions and 109 deletions
125
flake.lock
generated
125
flake.lock
generated
|
|
@ -73,10 +73,30 @@
|
||||||
"type": "github"
|
"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": {
|
"gitignore": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"pre-commit-hooks",
|
"git-hooks",
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -124,16 +144,16 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1759036355,
|
"lastModified": 1759070547,
|
||||||
"narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=",
|
"narHash": "sha256-JVZl8NaVRYb0+381nl7LvPE+A774/dRpif01FKLrYFQ=",
|
||||||
"owner": "nixos",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127",
|
"rev": "647e5c14cbd5067f44ac86b74f014962df460840",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nixos",
|
"owner": "NixOS",
|
||||||
"ref": "nixos-unstable",
|
"ref": "nixpkgs-unstable",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
|
@ -153,7 +173,39 @@
|
||||||
"type": "github"
|
"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": {
|
"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": {
|
"locked": {
|
||||||
"lastModified": 1758763312,
|
"lastModified": 1758763312,
|
||||||
"narHash": "sha256-puBMviZhYlqOdUUgEmMVJpXqC/ToEqSvkyZ30qQ09xM=",
|
"narHash": "sha256-puBMviZhYlqOdUUgEmMVJpXqC/ToEqSvkyZ30qQ09xM=",
|
||||||
|
|
@ -169,26 +221,10 @@
|
||||||
"type": "github"
|
"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": {
|
"nixvim": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-parts": "flake-parts_2",
|
"flake-parts": "flake-parts_2",
|
||||||
"nixpkgs": "nixpkgs_2",
|
"nixpkgs": "nixpkgs_3",
|
||||||
"nuschtosSearch": "nuschtosSearch",
|
"nuschtosSearch": "nuschtosSearch",
|
||||||
"systems": "systems_2"
|
"systems": "systems_2"
|
||||||
},
|
},
|
||||||
|
|
@ -229,32 +265,14 @@
|
||||||
"type": "github"
|
"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": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-parts": "flake-parts",
|
"flake-parts": "flake-parts",
|
||||||
"nixpkgs": "nixpkgs",
|
"git-hooks": "git-hooks",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable",
|
||||||
"nixvim": "nixvim",
|
"nixvim": "nixvim",
|
||||||
"pre-commit-hooks": "pre-commit-hooks"
|
"systems": "systems_3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"systems": {
|
"systems": {
|
||||||
|
|
@ -286,6 +304,21 @@
|
||||||
"repo": "default",
|
"repo": "default",
|
||||||
"type": "github"
|
"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",
|
"root": "root",
|
||||||
|
|
|
||||||
76
flake.nix
76
flake.nix
|
|
@ -1,75 +1,25 @@
|
||||||
{
|
{
|
||||||
description = "deCort.tech NeoVim configuration";
|
description = "EscapeAngle NeoVim configuration";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-25.05";
|
||||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
nixvim = {
|
nixvim.url = "github:nix-community/nixvim";
|
||||||
url = "github:nix-community/nixvim";
|
systems.url = "github:nix-systems/default";
|
||||||
};
|
git-hooks.url = "github:cachix/git-hooks.nix";
|
||||||
pre-commit-hooks = {
|
git-hooks.flake = false;
|
||||||
url = "github:cachix/pre-commit-hooks.nix";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
{
|
inputs@{ flake-parts, ... }:
|
||||||
nixpkgs,
|
|
||||||
nixvim,
|
|
||||||
flake-parts,
|
|
||||||
pre-commit-hooks,
|
|
||||||
...
|
|
||||||
}@inputs:
|
|
||||||
flake-parts.lib.mkFlake { inherit inputs; } {
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
systems = [
|
systems = import inputs.systems;
|
||||||
"aarch64-linux"
|
_module.args = { inherit inputs; };
|
||||||
"x86_64-linux"
|
imports = [
|
||||||
"aarch64-darwin"
|
./modules/flake
|
||||||
"x86_64-darwin"
|
./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
23
modules/flake/default.nix
Normal 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)
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
32
modules/flake/devshell.nix
Normal file
32
modules/flake/devshell.nix
Normal 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
12
overlays/default.nix
Normal 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
37
packages/default.nix
Normal 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
69
plugins/blink-cmp.nix
Normal 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
86
plugins/buffer.nix
Normal 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")
|
||||||
|
];
|
||||||
|
}
|
||||||
43
plugins/common/colorscheme.nix
Normal file
43
plugins/common/colorscheme.nix
Normal 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
149
plugins/common/default.nix
Normal 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 ];
|
||||||
|
}
|
||||||
40
plugins/common/functions.nix
Normal file
40
plugins/common/functions.nix
Normal 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
185
plugins/common/icons.nix
Normal 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
309
plugins/common/mappings.nix
Normal 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>
|
||||||
|
]])
|
||||||
|
'';
|
||||||
|
}
|
||||||
46
plugins/common/options.nix
Normal file
46
plugins/common/options.nix
Normal 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;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
52
plugins/common/plugins.nix
Normal file
52
plugins/common/plugins.nix
Normal 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
33
plugins/default.nix
Normal 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
150
plugins/git.nix
Normal 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
9
plugins/lang/default.nix
Normal 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
13
plugins/lang/nix.nix
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
plugins = {
|
||||||
|
lsp.servers = {
|
||||||
|
nil_ls = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
statix = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
21
plugins/lsp/conform.nix
Normal file
21
plugins/lsp/conform.nix
Normal 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
108
plugins/lsp/default.nix
Normal 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
120
plugins/lsp/mappings.nix
Normal 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")
|
||||||
|
];
|
||||||
|
}
|
||||||
54
plugins/lualine/default.nix
Normal file
54
plugins/lualine/default.nix
Normal 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 ./.))
|
||||||
|
);
|
||||||
|
}
|
||||||
150
plugins/lualine/sections.nix
Normal file
150
plugins/lualine/sections.nix
Normal 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
63
plugins/noice.nix
Normal 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
323
plugins/snacks/default.nix
Normal 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
126
plugins/snacks/mappings.nix
Normal 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
36
plugins/treesitter.nix
Normal 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
64
plugins/ux.nix
Normal 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;
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue