summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
Diffstat (limited to 'home')
-rw-r--r--home/default.nix24
-rw-r--r--home/git/default.nix18
-rw-r--r--home/neovim/default.nix27
-rw-r--r--home/neovim/filetype.nix20
-rw-r--r--home/neovim/lsp.nix106
-rw-r--r--home/zsh/default.nix25
-rw-r--r--home/zsh/plugins.nix69
7 files changed, 289 insertions, 0 deletions
diff --git a/home/default.nix b/home/default.nix
new file mode 100644
index 0000000..f0aa53b
--- /dev/null
+++ b/home/default.nix
@@ -0,0 +1,24 @@
+{ flakeInputs, metadata, ... }:
+
+{
+ # Use the flake input pkgs so Home Manager configuration can share overlays
+ # etc. with the rest of the configuration.
+ home-manager.useGlobalPkgs = true;
+
+ # Pass special arguments from flake.nix further down the chain. I really hate
+ # this split module system.
+ home-manager.extraSpecialArgs = { inherit flakeInputs metadata; };
+
+ # OKAY FUCK THIS SHIT. THERE IS ONE USER. IT IS ME. LINUS. I WILL ADD
+ # MULTIUSER SUPPORT IF IT EVER BECOMES A REQUIREMENT.
+ home-manager.users.linus = {
+ imports =
+ [
+ ./neovim
+ ./zsh
+ ./git
+ ];
+
+ xdg.enable = true;
+ };
+}
diff --git a/home/git/default.nix b/home/git/default.nix
new file mode 100644
index 0000000..8df44db
--- /dev/null
+++ b/home/git/default.nix
@@ -0,0 +1,18 @@
+{ ... }:
+
+{
+ programs.git = {
+ enable = true;
+
+ # Set privacy-respecting user information.
+ userName = "Linnnus";
+ userEmail = "[email protected]";
+ };
+
+ home.shellAliases = {
+ gs = "git status";
+ gd = "git diff";
+ gc = "git commit";
+ gap = "git add --patch";
+ };
+}
diff --git a/home/neovim/default.nix b/home/neovim/default.nix
new file mode 100644
index 0000000..883c170
--- /dev/null
+++ b/home/neovim/default.nix
@@ -0,0 +1,27 @@
+# This file contains the HM configuration options for Neovim.
+
+{ pkgs, lib, ... }:
+
+{
+ imports =
+ [
+ ./lsp.nix
+ ./filetype.nix
+ ];
+
+ programs.neovim = {
+ enable = true;
+
+ # Typing `vi`, `vim`, or `vimdiff` will also run neovim.
+ viAlias = true;
+ vimAlias = true;
+ vimdiffAlias = true;
+ };
+
+ # Set Neovim as the default editor.
+ home.sessionVariables.EDITOR = "nvim";
+ home.sessionVariables.VISUAL = "nvim";
+
+ # Use neovim as man pager.
+ home.sessionVariables.MANPAGER = "nvim +Man!";
+}
diff --git a/home/neovim/filetype.nix b/home/neovim/filetype.nix
new file mode 100644
index 0000000..66d5e68
--- /dev/null
+++ b/home/neovim/filetype.nix
@@ -0,0 +1,20 @@
+# This module configures various syntax/filetype plugins for Neovim.
+
+{ pkgs, ... }:
+
+let
+ vim-noweb = pkgs.vimUtils.buildVimPlugin {
+ pname = "vim-noweb";
+ version = "26-08-2023"; # day of retrieval
+ src = pkgs.fetchzip {
+ url = "https://metaed.com/papers/vim-noweb/vim-noweb.tgz";
+ hash = "sha256-c5eUZiKIjAfjJ33l821h5DjozMpMf0CaK03QIkSUfxg=";
+ };
+ };
+in
+{
+ programs.neovim.plugins = with pkgs.vimPlugins; [
+ vim-nix
+ vim-noweb
+ ];
+}
diff --git a/home/neovim/lsp.nix b/home/neovim/lsp.nix
new file mode 100644
index 0000000..588fb8b
--- /dev/null
+++ b/home/neovim/lsp.nix
@@ -0,0 +1,106 @@
+# This module sets up LSP server configurations for Neovim. It is waaay
+# overcomplicated as it kind of turned into an experiment in generating Lua
+# code from a Nix attrset.
+
+{ pkgs, lib, ... }:
+
+{
+ programs.neovim.plugins = [
+ {
+ plugin = pkgs.vimPlugins.nvim-lspconfig;
+ type = "lua";
+ config = ''
+ local lspconfig = require("lspconfig")
+ local util = require("lspconfig.util")
+
+ -- Mappings.
+ -- See `:help vim.diagnostic.*` for documentation on any of the below functions
+ local opts = { noremap=true, silent=true }
+ vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float, opts)
+ vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
+ vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
+ vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, opts)
+
+ -- Use an on_attach function to only map the following keys
+ -- after the language server attaches to the current buffer
+ local on_attach = function(client, bufnr)
+ -- Enable completion triggered by <c-x><c-o>
+ vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
+
+ -- Mappings.
+ -- See `:help vim.lsp.*` for documentation on any of the below functions
+ local bufopts = { noremap=true, silent=true, buffer=bufnr }
+ vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
+ vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
+ vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
+ vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
+ vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
+ vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, bufopts)
+ vim.keymap.set('n', '<leader>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
+ vim.keymap.set('n', '<leader>wl', function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, bufopts)
+ vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, bufopts)
+ vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, bufopts)
+ vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, bufopts)
+ vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
+ vim.keymap.set('n', '<leader>f', function() vim.lsp.buf.format { async = true } end, bufopts)
+ vim.keymap.set('n', '<leader>s', function() vim.cmd[[ClangdSwitchSourceHeader]] end, bufopts)
+ end
+
+ -- Use a loop to conveniently call 'setup' on multiple servers and
+ -- map buffer local keybindings when the language server attaches
+ local servers = {
+ pyright = { cmd = { "${pkgs.pyright}/bin/pyright-langserver" } },
+ rnix = { cmd = { "${pkgs.rnix-lsp}/bin/rnix-lsp" } },
+ denols = {
+ init_options = {
+ enable = true,
+ unstable = true,
+ lint = true,
+ },
+ cmd = { "${pkgs.deno}/bin/deno", "lsp", "--unstable" },
+ root_dir = function(startpath)
+ if util.find_package_json_ancestor(startpath) then
+ -- This is a Node project; let tsserver handle this one.
+ return nil
+ else
+ -- Otherwise, we try to find the root or
+ -- default to the current directory.
+ return util.root_pattern("deno.json", "deno.jsonc", ".git")(startpath)
+ or util.path.dirname(startpath)
+ end
+ end,
+ },
+ };
+ for server, config in pairs(servers) do
+ # set common options
+ config.on_attach = on_attach;
+ config.debounce_text_changes = 150;
+
+ lspconfig[server].setup(config)
+ end
+ '';
+ }
+ ];
+}
+
+# I spent like an hour writing this, only to find it was a pretty bad idea.
+#
+# nixToLua = s:
+# if builtins.isAttrs s then
+# let
+# renderAttr = name: value: "[ [==========[" + name + "]==========] ] = " + (nixToLua value);
+# attrsList = map (name: renderAttr name s.${name}) (lib.attrNames s);
+# attrsListStr = lib.concatStringsSep ", " attrsList;
+# in
+# "{ ${attrsListStr} }"
+# else if builtins.isList s then
+# "{ " + (lib.concatStringsSep ", " (map nixToLua s)) + " }"
+# else if builtins.isString s then
+# # Oh boy I sure hope `s` doesn't contain "]==========]".
+# "[==========[" + s + "]==========]"
+# else if builtins.isInt s || builtins.isFloat s then
+# toString s
+# else
+# throw "Cannot convert ${builtins.typeOf s} to Lua value!";
diff --git a/home/zsh/default.nix b/home/zsh/default.nix
new file mode 100644
index 0000000..1b8ce16
--- /dev/null
+++ b/home/zsh/default.nix
@@ -0,0 +1,25 @@
+{ pkgs, config, lib, ... }:
+
+{
+ imports =
+ [
+ ./plugins.nix
+ ];
+
+ programs.zsh = {
+ enable = true;
+
+ defaultKeymap = "viins";
+
+ # Feeble attempt at cleaning up home directory.
+ # TODO: dotDir = (pathRelativeTo config.xdg.configHome config.home) + "/zsh";
+ dotDir = ".config/zsh";
+ history.path = config.xdg.cacheHome + "/zsh/history";
+
+ };
+
+ programs.fzf = {
+ enable = true;
+ enableZshIntegration = true;
+ };
+}
diff --git a/home/zsh/plugins.nix b/home/zsh/plugins.nix
new file mode 100644
index 0000000..3bebfce
--- /dev/null
+++ b/home/zsh/plugins.nix
@@ -0,0 +1,69 @@
+{ pkgs, lib, config, ... }:
+
+let
+ inherit (lib.strings) concatStringsSep;
+ inherit (lib.attrsets) catAttrs;
+
+ plugins =
+ [
+ {
+ name = "autovenv";
+ src = pkgs.fetchFromGitHub {
+ owner = "linnnus";
+ repo = "autovenv";
+ rev = "d9f0cd7";
+ hash = "sha256-GfJIybMYxE97xLSkrOSGsn+AREmnCyqe9n2aZwjw4w4=";
+ };
+ }
+ {
+ name = "zsh-cwd-history";
+ src = pkgs.stdenvNoCC.mkDerivation rec {
+ pname = "zsh-cwd-history";
+ version = "73afed8";
+
+ src = pkgs.fetchFromGitHub {
+ owner = "ericfreese";
+ repo = pname;
+ rev = version;
+ hash = "sha256-xW11wPFDuFU80AzgAgLwkvK7Qv58fo3i3kSasE3p0zs=";
+ };
+
+ fixupPhase = ''
+ substituteInPlace ${pname}.zsh \
+ --replace md5 ${pkgs.outils}/bin/md5
+
+ mkdir -p $out
+ mv * $out
+ '';
+
+ # This is kind of a weird, useless derivation, so we have to
+ # manually avoid doing lots of the usual stuff.
+ dontInstall = true;
+ };
+ config = ''
+ # Where to but history files
+ export ZSH_CWD_HISTORY_DIR=${config.xdg.dataHome}/zsh-cwd-history
+ mkdir -p "$ZSH_CWD_HISTORY_DIR"
+
+ # Toggle between global/local history
+ bindkey '^G' cwd-history-toggle
+ '';
+ }
+ {
+ name = "zsh-vi-mode-cursor";
+ src = pkgs.fetchFromGitHub {
+ owner = "Buckmeister";
+ repo = "zsh-vi-mode-cursor";
+ rev = "fa7cc0973ee71636e906e25e782d0aea19545d60";
+ hash = "sha256-j73M4bvAoHWt5Wwg47hM0p5Or74x/3btTOPnI22SqG8=";
+ };
+ }
+ ];
+in
+{
+ programs.zsh = {
+ plugins = map (p: removeAttrs p ["config"]) plugins;
+
+ initExtra = concatStringsSep "\n" (catAttrs "config" plugins);
+ };
+}