return {
	-- heuristic indent
	{ "tpope/vim-sleuth" },
	{
		"nvim-treesitter/nvim-treesitter",
		build = ":TSUpdate",
		config = function()
			local configs = require("nvim-treesitter.configs")
			--@diagnostic disable-next-line: missing-fields
			configs.setup({
				ensure_installed = {
					"bash",
					--"zsh",
					"c",
					"cmake",
					"dockerfile",
					"gitignore",
					"go",
					"gotmpl",
					"java",
					"json",
					"lua",
					"make",
					"markdown",
					"markdown_inline",
					"python",
					"query",
					"regex",
					"rust",
					"terraform",
					"vim",
					"vimdoc",
					"yaml",
				},

				-- Install parsers synchronously (only applied to `ensure_installed`)
				sync_install = false,

				-- Automatically install missing parsers when entering buffer
				-- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally
				auto_install = true,

				-- List of parsers to ignore installing (or "all")
				ignore_install = { "javascript" },

				---- If you need to change the installation directory of the parsers (see -> Advanced Setup)
				-- parser_install_dir = "/some/path/to/store/parsers",
				-- Remember to run vim.opt.runtimepath:append("/some/path/to/store/parsers")!

				highlight = {
					enable = true,

					-- NOTE: these are the names of the parsers and not the filetype. (for example if you want to
					-- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is
					-- the name of the parser)
					-- list of language that will be disabled
					disable = {},
					-- Or use a function for more flexibility, e.g. to disable slow treesitter highlight for large files
					-- disable = function(lang, buf)
					--     local max_filesize = 100 * 1024 -- 100 KB
					--     local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf))
					--     if ok and stats and stats.size > max_filesize then
					--         return true
					--     end
					-- end,

					-- Setting this to true will run `:h syntax` and tree-sitter at the same time.
					-- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
					-- Using this option may slow down your editor, and you may see some duplicate highlights.
					-- Instead of true it can also be a list of languages
					additional_vim_regex_highlighting = false,
				},
				indent = {
					enable = false,
					disable = {},
				},
			})
		end,
	},
	{
		"stevearc/conform.nvim",
		event = { "BufReadPre", "BufNewFile" },
		config = function()
			local conform = require("conform")
			conform.setup({
				formatters_by_ft = {
					-- brew install stylua
					lua = { "stylua" },
					-- install rust
					rust = { "rustfmt" },
					-- brew install prettier
					markdown = { "prettierd", "prettier" },
					json = { "prettierd", "prettier" },
					yaml = { "prettierd", "prettier" },
					-- install terraform
					terraform = { "terraform_fmt" },
					-- brew install shfmt
					bash = { "shfmt" },
					zsh = { "shfmt" },
					sh = { "shfmt" },
					-- brew install ruff
					python = { "ruff" },
					-- go install mvdan.cc/gofumpt@latest
					go = { "gofumpt" },
				},
				formatters = {
					prettier = {
						prepend_args = { "--prose-wrap", "always" },
					},
					shfmt = {
						prepend_args = { "-i", "4", "-ci" },
					},
					ruff = {
						prepend_args = { "--extend-select", "I" },
					},
				},
				format_on_save = {
					lsp_fallback = true,
					async = false,
					timeout_ms = 3000,
				},
			})

			vim.keymap.set({ "n", "v" }, "<leader>mp", function()
				conform.format({
					lsp_fallback = true,
					async = false,
					timeout_ms = 5000,
				})
			end, { desc = "Format file or range (in visual mode)" })
		end,
	},
}
