From f7e02b3ccf2f6b17eb72a13c378c04f43c52cf87 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 18 Mar 2021 14:03:17 +0000 Subject: [PATCH] packer: init plugin --- flake.lock | 18 ++++---- flake.nix | 14 +++++- plugins/default.nix | 2 + plugins/helpers.nix | 15 +++++-- plugins/languages/treesitter.nix | 19 +++++--- plugins/pluginmanagers/packer.nix | 73 +++++++++++++++++++++++++++++++ 6 files changed, 119 insertions(+), 22 deletions(-) create mode 100644 plugins/pluginmanagers/packer.nix diff --git a/flake.lock b/flake.lock index 9552526c26..13353e5464 100644 --- a/flake.lock +++ b/flake.lock @@ -57,11 +57,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1615968721, - "narHash": "sha256-ZcwQ6b0opzgZZw9Tnmbd+F0VfxETk1CdQw6wv6Z9sXs=", + "lastModified": 1616055137, + "narHash": "sha256-pEVSPu8MnqAj4xHYPZ/oKcwFkPqFKm2fMDv1nw8YA8E=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "d1e9a434963196fc1a3415e146ca66f00024651c", + "rev": "b247024d70256660111942e6c51e6486487edc14", "type": "github" }, "original": { @@ -88,11 +88,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1615949961, - "narHash": "sha256-4H/yj5nXo/BztcYUyAaz5NkNmF1Gb02nxeQ6C2w95ig=", + "lastModified": 1615991631, + "narHash": "sha256-TEDPXYy9sVLyctW/OBqxhxlxPmvTwRqXBch0eexJm8Y=", "owner": "nixos", "repo": "nixpkgs", - "rev": "8e1891d5b8d0b898db8890ddab73141f0cd3c2bc", + "rev": "f137bcd5c92906ae0f924769a95b8c8e6602f90b", "type": "github" }, "original": { @@ -104,11 +104,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1615797423, - "narHash": "sha256-5NGDZXPQzuoxf/42NiyC9YwwhwzfMfIRrz3aT0XHzSc=", + "lastModified": 1615888535, + "narHash": "sha256-wR49KkuahcNq1xU3Tk+Mfbob3g2/B/fpbWPw8X+1wsg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "266dc8c3d052f549826ba246d06787a219533b8f", + "rev": "1f77a4c8c74bbe896053994836790aa9bf6dc5ba", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index c83f1b984d..fb7d4c946a 100644 --- a/flake.nix +++ b/flake.nix @@ -43,8 +43,18 @@ pkgs.vimPlugins.vim-nix ]; - options.number = true; - options.mouse = "a"; + options = { + number = true; + mouse = "a"; + tabstop = 2; + shiftwidth = 2; + expandtab = true; + smarttab = true; + autoindent = true; + cindent = true; + linebreak = true; + hidden = true; + }; maps.normalVisualOp."รง" = ":"; diff --git a/plugins/default.nix b/plugins/default.nix index 93ad1fa8d4..f3a7d6822e 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -5,6 +5,8 @@ ./colorschemes/one.nix ./colorschemes/base16.nix + ./pluginmanagers/packer.nix + ./statuslines/lightline.nix ./statuslines/airline.nix diff --git a/plugins/helpers.nix b/plugins/helpers.nix index d75a97eb6b..d5acfffc50 100644 --- a/plugins/helpers.nix +++ b/plugins/helpers.nix @@ -9,10 +9,15 @@ rec { # lua equivalents! toLuaObject = args: if builtins.isAttrs args then - "{" + (concatStringsSep "," - (mapAttrsToList - (n: v: "[${toLuaObject n}] = " + (toLuaObject v)) - (filterAttrs (n: v: !isNull v || v == {}) args))) + "}" + if hasAttr "__raw" args then + args.__raw + else + "{" + (concatStringsSep "," + (mapAttrsToList + (n: v: if head (stringToCharacters n) == "@" then + toLuaObject v + else "[${toLuaObject n}] = " + (toLuaObject v)) + (filterAttrs (n: v: !isNull v || v == {}) args))) + "}" else if builtins.isList args then "{" + concatMapStringsSep "," toLuaObject args + "}" else if builtins.isString args then @@ -97,4 +102,6 @@ rec { inherit value global; }; + + mkRaw = r: { __raw = r; }; } diff --git a/plugins/languages/treesitter.nix b/plugins/languages/treesitter.nix index 81d7c5ca67..9db8f7eeec 100644 --- a/plugins/languages/treesitter.nix +++ b/plugins/languages/treesitter.nix @@ -17,8 +17,7 @@ in disabledLanguages = mkOption { type = types.listOf types.str; - # Nix is out of date right now! Try not to use it :D - default = [ "nix" ]; + default = []; description = "A list of languages to disable"; }; @@ -76,11 +75,17 @@ in }; in mkIf cfg.enable { programs.nixvim = { - extraPlugins = [ pkgs.vimPlugins.nvim-treesitter ]; - - extraConfigLua = '' - require('nvim-treesitter.configs').setup(${helpers.toLuaObject tsOptions}) - ''; + plugins.packer = { + enable = true; + plugins = [{ + name = "nvim-treesitter/nvim-treesitter"; + run = ":TSUpdate"; + config = helpers.mkRaw ''function() + require('nvim-treesitter.configs').setup(${helpers.toLuaObject tsOptions}) + end''; + }]; + }; + extraPackages = [ pkgs.tree-sitter ]; options = mkIf cfg.folding { foldmethod = "expr"; diff --git a/plugins/pluginmanagers/packer.nix b/plugins/pluginmanagers/packer.nix new file mode 100644 index 0000000000..b0aa5a6c10 --- /dev/null +++ b/plugins/pluginmanagers/packer.nix @@ -0,0 +1,73 @@ +{ pkgs, config, lib, ... }: +with lib; +let + cfg = config.programs.nixvim.plugins.packer; + helpers = import ../helpers.nix { lib = lib; }; +in { + options = { + programs.nixvim.plugins.packer = { + enable = mkEnableOption "Enable packer.nvim"; + + plugins = mkOption { + type = types.listOf (types.oneOf [types.str (with types; let + mkOpt = type: desc: mkOption { + type = nullOr type; + default = null; + description = desc; + }; + function = attrsOf str; + in types.submodule { + options = { + name = mkOption { + type = str; + description = "Name of the plugin to install"; + }; + + disable = mkOpt bool "Mark plugin as inactive"; + as = mkOpt bool "Specifies an alias under which to install the plugin"; + installer = mkOpt function "A custom installer"; + updater = mkOpt function "A custom updater"; + after = mkOpt (oneOf [str (listOf any)]) "Plugins to load after this plugin"; + rtp = mkOpt str "Specifies a subdirectory of the plugin to add to runtimepath"; + opt = mkOpt str "Marks a plugin as optional"; + branch = mkOpt str "Git branch to use"; + tag = mkOpt str "Git tag to use"; + commit = mkOpt str "Git commit to use"; + lock = mkOpt bool "Skip this plugin in updates"; + run = mkOpt (oneOf [str function]) "Post-install hook"; + requires = mkOpt (oneOf [str (listOf any)]) "Plugin dependencies"; + rocks = mkOpt (oneOf [str (listOf any)]) "Luarocks dependencies"; + config = mkOpt (oneOf [str function]) "Code to run after this plugin is loaded"; + setup = mkOpt (oneOf [str function]) "Code to be run before this plugin is loaded"; + cmd = mkOpt (oneOf [str (listOf str)]) "Commands which load this plugin"; + ft = mkOpt (oneOf [str (listOf str)]) "Filetypes which load this plugin"; + keys = mkOpt (oneOf [str (listOf str)]) "Keymaps which load this plugin"; + event = mkOpt (oneOf [str (listOf str)]) "Autocommand events which load this plugin"; + fn = mkOpt (oneOf [str (listOf str)]) "Functions which load this plugin"; + cond = mkOpt (oneOf [str function (listOf (oneOf [str function]))]) "Conditional test to load this plugin"; + module = mkOpt (oneOf [str (listOf str)]) "Patterns of module names which load this plugin"; + }; + })]); + default = []; + description = "List of plugins"; + }; + }; + }; + + config = mkIf cfg.enable { + programs.nixvim = { + extraPlugins = [ pkgs.vimPlugins.packer-nvim ]; + + extraConfigLua = let + plugins = map (plugin: if isAttrs plugin then + mapAttrs' (k: v: { name = if k == "name" then "@" else k; value = v; }) plugin + else plugin) cfg.plugins; + packedPlugins = if length plugins == 1 then head plugins else plugins; + in mkIf (cfg.plugins != []) '' + require('packer').startup(function() + use ${helpers.toLuaObject packedPlugins} + end) + ''; + }; + }; +}