{ osConfig , ... }:
let
    hostname = osConfig.networking.hostName;
in
{
  programs.nixvim.plugins = {
    lsp = {
      enable = true;
      servers = {
        lua-ls = {enable = true;};
        nixd = {
          enable = true;
          cmd = ["nixd"];
          settings = {
            nixpkgs.expr = "import <nixpkgs> { }";
            options = {
              nixos.expr = "(builtins.getFlake \"/etc/nixos\").nixosConfigurations.${hostname}.options";
              # TODO get home-manager options working when hm imported as submodule
              # home_manager.expr = "(builtins.getFlake \"github:nix-community/home-manager\").homeConfigurations.${hostname}.options";
            };
          };
        };
        bashls = {enable = true;};
        pyright = {enable = true;};
        html = {enable = true;};
        marksman = {enable = true;};
        ccls = {enable = true;};
        cssls = {enable = true;};
        r-language-server = {enable = true;};
        tsserver = {enable = true;};
      };
      keymaps = {
        lspBuf = {
          gd = {
            action = "definition";
            desc = "Goto Definition";
          };
          gr = {
            action = "references";
            desc = "Goto References";
          };
          gD = {
            action = "declaration";
            desc = "Goto Declaration";
          };
          gI = {
            action = "implementation";
            desc = "Goto Implementation";
          };
          gT = {
            action = "type_definition";
            desc = "Type Definition";
          };
          gK = {
            action = "hover";
            desc = "Hover";
          };
          "<leader>cw" = {
            action = "workspace_symbol";
            desc = "Workspace Symbol";
          };
          "<leader>cr" = {
            action = "rename";
            desc = "Rename";
          };
        };
      };
    };
    # TODO: enable otter.nvim when merged into nixvim stable
    #    otter = {
    #      enable = true;
    #    };
  };
}