diff --git a/nvim/init.lua b/nvim/init.lua
index f9b4270..27165e6 100644
--- a/nvim/init.lua
+++ b/nvim/init.lua
@@ -2,3 +2,4 @@ require("config.options")
 require("config.keymaps")
 
 require("config.lazy")
+require("config.filetypes")
diff --git a/nvim/lua/config/filetypes.lua b/nvim/lua/config/filetypes.lua
new file mode 100644
index 0000000..78a075b
--- /dev/null
+++ b/nvim/lua/config/filetypes.lua
@@ -0,0 +1,31 @@
+vim.filetype.add({
+  filename = {
+    ["user-dirs.dirs"] = "conf",
+
+    ["gruvbox.conf"]   = "kitty",
+    ["kitty.conf"]     = "kitty",
+    ["ssh.conf"]       = "kitty",
+
+    ["dot-zshenv"]     = "zsh",
+    ["dot-zshrc"]      = "zsh"
+  },
+
+  pattern = {
+    [".*/git/config"] = "gitconfig"
+  }
+})
+
+vim.api.nvim_create_autocmd("Filetype", {
+  group = vim.api.nvim_create_augroup("setIndent", {}),
+  pattern = {
+    "lua",
+    "css",
+    "html",
+    "htmldjango",
+    "javascript",
+    "javascriptreact",
+    "json",
+    "svelte"
+  },
+  command = "setlocal tabstop=2 softtabstop=2 shiftwidth=2"
+})
diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua
index f2d9cc5..c18453b 100644
--- a/nvim/lua/config/keymaps.lua
+++ b/nvim/lua/config/keymaps.lua
@@ -19,7 +19,7 @@ set("n", "N", "Nzz")
 set("n", "<c-u>", "<c-u>zz")
 set("n", "<c-d>", "<c-d>zz")
 
-set("n", "<leader>w", "<c-w>")
+set("n", "<leader>w", "<c-w>", { remap = true })
 
 set("n", "<cr>", function()
   if vim.v.hlsearch == 1 then
@@ -34,9 +34,9 @@ vim.api.nvim_create_autocmd("Filetype", {
   pattern = "lua",
   group = vim.api.nvim_create_augroup("Execute Lua", { clear = true }),
   callback = function()
-    vim.keymap.set("n", "<leader>x", "<cmd>.lua<cr>", { buffer = true })
-    vim.keymap.set("x", "<leader>x", ":lua<cr>", { buffer = true })
-    vim.keymap.set("n", "<leader><leader>x", "<cmd>%lua<cr>", { buffer = true })
+    set("n", "<leader>x", "<cmd>.lua<cr>", { buffer = true })
+    set("x", "<leader>x", ":lua<cr>", { buffer = true })
+    set("n", "<leader><leader>x", "<cmd>%lua<cr>", { buffer = true })
   end,
 })
 
@@ -58,4 +58,13 @@ function M.telescope()
   end)
 end
 
+function M.harpoon()
+  set("", "<leader>ha", require("harpoon.mark").add_file)
+  set("", "<leader>ho", require("harpoon.ui").toggle_quick_menu)
+
+  set("", "<leader>hf", function() require("harpoon.ui").nav_file(1) end)
+  set("", "<leader>hd", function() require("harpoon.ui").nav_file(2) end)
+  set("", "<leader>hs", function() require("harpoon.ui").nav_file(2) end)
+end
+
 return M
diff --git a/nvim/lua/config/lazy.lua b/nvim/lua/config/lazy.lua
index b7ef23e..65c6629 100644
--- a/nvim/lua/config/lazy.lua
+++ b/nvim/lua/config/lazy.lua
@@ -20,22 +20,9 @@ require("lazy").setup({
   },
 
   spec = {
-    { "ellisonleao/gruvbox.nvim", config = function() vim.cmd.colorscheme "gruvbox" end },
+    { import = "config.plugins" },
 
-    {
-      "nvim-treesitter/nvim-treesitter",
-      opts = {
-        ensure_installed = "all",
-        highlight = {
-          enable = true
-        },
-        indent = {
-          enable = true
-        }
-      },
-      main = "nvim-treesitter.configs",
-      build = ":TSUpdate",
-    },
+    { "ellisonleao/gruvbox.nvim", config = function() vim.cmd.colorscheme "gruvbox" end },
 
     {
       "folke/flash.nvim",
@@ -46,6 +33,14 @@ require("lazy").setup({
       },
     },
 
-    { import = "config.plugins" }
+    {
+      "abecodes/tabout.nvim",
+      config = {
+        ignore_beginning = false
+      }
+    },
+
+    "ThePrimeagen/harpoon",
+    "fladson/vim-kitty"
   },
 })
diff --git a/nvim/lua/config/plugins/blink.lua b/nvim/lua/config/plugins/blink.lua
new file mode 100644
index 0000000..ecb6245
--- /dev/null
+++ b/nvim/lua/config/plugins/blink.lua
@@ -0,0 +1,13 @@
+return {
+  "saghen/blink.cmp",
+  version = "1.*",
+  opts = {
+    completion = {
+      list = {
+        selection = { preselect = false, auto_insert = false }
+      },
+      documentation = { auto_show = true },
+      ghost_text = { enabled = true }
+    }
+  }
+}
diff --git a/nvim/lua/config/plugins/lsp.lua b/nvim/lua/config/plugins/lsp.lua
index 0047699..c9dc415 100644
--- a/nvim/lua/config/plugins/lsp.lua
+++ b/nvim/lua/config/plugins/lsp.lua
@@ -13,23 +13,11 @@ return {
       }
     },
     config = function()
-      require("lspconfig").lua_ls.setup {}
+      local lspconfig = require("lspconfig")
 
-      vim.api.nvim_create_autocmd("LspAttach", {
-        callback = function(args)
-          local client = vim.lsp.get_client_by_id(args.data.client_id)
-          if not client then return end
-
-          if client.supports_method("textDocument/formatting") then
-            vim.api.nvim_create_autocmd("BufWritePre", {
-              buffer = args.buf,
-              callback = function()
-                vim.lsp.buf.format({ bufnr = args.buf, id = client.id })
-              end
-            })
-          end
-        end
-      })
+      lspconfig.lua_ls.setup {}
+      lspconfig.pylsp.setup {}
+      lspconfig.emmet_ls.setup{}
     end
   }
 }
diff --git a/nvim/lua/config/plugins/none-ls.lua b/nvim/lua/config/plugins/none-ls.lua
new file mode 100644
index 0000000..89c298d
--- /dev/null
+++ b/nvim/lua/config/plugins/none-ls.lua
@@ -0,0 +1,12 @@
+return {
+  "nvimtools/none-ls.nvim",
+  config = function()
+    local null_ls = require("null-ls")
+
+    null_ls.setup({
+      sources = {
+        null_ls.builtins.formatting.prettier
+      }
+    })
+  end
+}
diff --git a/nvim/lua/config/plugins/treesitter.lua b/nvim/lua/config/plugins/treesitter.lua
new file mode 100644
index 0000000..287bd33
--- /dev/null
+++ b/nvim/lua/config/plugins/treesitter.lua
@@ -0,0 +1,14 @@
+return {
+  "nvim-treesitter/nvim-treesitter",
+  opts = {
+    ensure_installed = "all",
+    highlight = {
+      enable = true
+    },
+    indent = {
+      enable = true
+    }
+  },
+  main = "nvim-treesitter.configs",
+  build = ":TSUpdate",
+}