diff options
author | Linnnus <[email protected]> | 2023-09-07 16:53:41 +0200 |
---|---|---|
committer | Linnnus <[email protected]> | 2023-09-07 16:53:41 +0200 |
commit | edcc3acea595d3045253c3c2fe2462599c1c54e0 (patch) | |
tree | 81e17fc5fe4f0a52d30e8d0209c6080cc77eda32 /home | |
parent | d31d1bae8c38e145cdbafe105401d9528b416779 (diff) |
Reorganize everything
Diffstat (limited to 'home')
-rw-r--r-- | home/default.nix | 24 | ||||
-rw-r--r-- | home/git/default.nix | 18 | ||||
-rw-r--r-- | home/neovim/default.nix | 27 | ||||
-rw-r--r-- | home/neovim/filetype.nix | 20 | ||||
-rw-r--r-- | home/neovim/lsp.nix | 106 | ||||
-rw-r--r-- | home/zsh/default.nix | 25 | ||||
-rw-r--r-- | home/zsh/plugins.nix | 69 |
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); + }; +} |