{pkgs, ...}: {
  home.sessionVariables = {
    EDITOR = "hx";
    ELECTRON_OZONE_PLATFORM_HINT = "wayland";
    NIXOS_CONFIG = "/home/uzair/Documents/nixos-config";
  };

  programs.neovim = let
    toLua = str: "lua << EOF\n${str}\nEOF\n";
    toLuaFile = file: "lua << EOF\n${builtins.readFile file}\nEOF\n";
  in {
    enable = true;
    plugins = with pkgs.vimPlugins; [
      nvim-cmp
      neoformat
      rustaceanvim
      telescope-fzf-native-nvim
      cmp_luasnip
      cmp-nvim-lsp
      luasnip
      friendly-snippets
      nvim-web-devicons
      vim-nix
      copilot-vim

      {
        plugin = nvim-lspconfig;
        config = toLuaFile ./nvimPlugins/lsp.lua;
      }

      {
        plugin = comment-nvim;
        config = toLua "require(\"Comment\").setup()";
      }

      {
        plugin = catppuccin-nvim;
        config = "colorscheme catppuccin-mocha";
      }

      {
        plugin = telescope-nvim;
        config = toLuaFile ./nvimPlugins/telescope.lua;
      }

      {
        plugin = nvim-cmp;
        config = toLuaFile ./nvimPlugins/cmp.lua;
      }

      {
        plugin = lualine-nvim;
        config = toLuaFile ./nvimPlugins/lualine.lua;
      }

      {
        plugin = trouble-nvim;
        #        config = toLuaFile ./nvimPlugins/trouble.lua;
      }

      {
        plugin = nvim-tree-lua;
        config = toLuaFile ./nvimPlugins/tree.lua;
      }

      {
        plugin = nvim-treesitter.withPlugins (p: [
          p.tree-sitter-nix
          p.tree-sitter-vim
          p.tree-sitter-bash
          p.tree-sitter-json
          p.tree-sitter-yaml
          p.tree-sitter-typescript
          p.tree-sitter-toml
          p.tree-sitter-sql
          p.tree-sitter-rust
          p.tree-sitter-markdown
          p.tree-sitter-make
          p.tree-sitter-java
          p.tree-sitter-kotlin
          p.tree-sitter-html
          p.tree-sitter-fish
          p.tree-sitter-css
          p.tree-sitter-cpp
          p.tree-sitter-cmake
          p.tree-sitter-c-sharp
          p.tree-sitter-c
        ]);
        config = toLuaFile ./nvimPlugins/treesitter.lua;
      }
    ];

    extraLuaConfig = ''
      ${builtins.readFile ./nvimPlugins/other.lua}
    '';

    extraPackages = with pkgs; [
      wl-clipboard
      ripgrep
    ];
  };

  programs.helix = {
    enable = true;
  };

  home.packages = with pkgs; [
    # GUI code editors
    kdePackages.kate
    vscode.fhs

    # Utilities
    wget
    unzip

    # IDE
    jetbrains.idea-ultimate

    # nix language server
    nixd

    # nix formatter
    alejandra

    # something for fish lol
    fasd
  ];
}
