return function()
	-- This list delineates the per-language nodes used for guiding |ibl| in highlighting the current scope
	-- It is extracted from each language's `indents.scm` file
	-- NOTE: Only a subset of the supported programming languages is included
	--       If your preferred language isn't listed, you can add it to the user config
	local nodes = {
		bibtex = {
			"entry",
		},
		c = {
			"case_statement",
			"compound_literal_expression",
			"enumerator_list",
			"field_declaration_list",
			"initializer_list",
			"init_declarator",
		},
		cmake = {
			"block_def",
			"foreach_loop",
			"function_def",
			"if_condition",
			"macro_def",
			"normal_command",
			"while_loop",
		},
		cpp = {
			"case_statement",
			"compound_literal_expression",
			"condition_clause",
			"enumerator_list",
			"field_declaration_list",
			"field_initializer_list",
			"init_declarator",
			"initializer_list",
			"namespace_definition",
		},
		css = {
			"block",
			"declaration",
		},
		d = {
			"aggregate_body",
			"block_statement",
			"case_statement",
			"expression_statement",
			"function_body",
			"parameters",
			"scope_statement",
			"template_parameters",
		},
		dart = {
			"arguments",
			"class_body",
			"formal_parameter",
			"formal_parameter_list",
			"function_body",
			"function_expression_body",
			"initializers",
			"list_literal",
			"return_statement",
			"switch_block",
		},
		dot = {
			"block",
			"attr_list",
		},
		ecma = {
			"arguments",
			"array",
			"binary_expression",
			"call_expression",
			"class_body",
			"export_clause",
			"formal_parameters",
			"named_imports",
			"object",
			"object_pattern",
			"parenthesized_expression",
			"return_statement",
			"switch_case",
			"switch_default",
			"switch_statement",
			"template_substitution",
			"ternary_expression",
		},
		elixir = {
			"arguments",
			"block",
			"do_block",
			"list",
			"map",
			"tuple",
		},
		firrtl = {
			"memory",
		},
		fortran = {
			"derived_type_definition",
			"do_loop_statement",
			"enum",
			"function",
			"if_statement",
			"module",
			"program",
			"subroutine",
			"where_statement",
		},
		gleam = {
			"anonymous_function",
			"assert",
			"case",
			"constant",
			"external_function",
			"function",
			"import",
			"let",
			"list",
			"constant",
			"function",
			"type_definition",
			"type_alias",
			"todo",
			"tuple",
		},
		go = {
			"call_expression",
			"communication_case",
			"const_declaration",
			"default_case",
			"expression_case",
			"import_declaration",
			"literal_value",
			"parameter_list",
			"struct_type",
			"type_case",
			"type_declaration",
			"var_declaration",
		},
		html = {
			"start_tag",
			"self_closing_tag",
		},
		java = {
			"annotation_argument_list",
			"annotation_type_body",
			"argument_list",
			"array_initializer",
			"class_body",
			"constructor_body",
			"element_value_array_initializer",
			"enum_body",
			"formal_parameters",
			"interface_body",
			"method_invocation",
			"switch_block",
		},
		javascript = {
			"arguments",
			"array",
			"binary_expression",
			"call_expression",
			"class_body",
			"export_clause",
			"formal_parameters",
			"jsx_expression",
			"jsx_self_closing_element",
			"named_imports",
			"object",
			"object_pattern",
			"parenthesized_expression",
			"return_statement",
			"switch_case",
			"switch_default",
			"switch_statement",
			"template_substitution",
			"ternary_expression",
		},
		julia = {
			"assignment",
			"call_expression",
			"compound_statement",
			"comprehension_expression",
			"for_binding",
			"if_statement",
			"matrix_expression",
			"parenthesized_expression",
			"struct_definition",
			"tuple_expression",
			"vector_expression",
		},
		just = {
			"external_command",
			"recipe",
			"string",
		},
		linkerscript = {
			"memory_command",
			"output_section",
			"phdrs_command",
			"sections_command",
		},
		lua = {
			"arguments",
			"field",
			"method_index_expression",
			"return_statement",
			"table_constructor",
		},
		matlab = {
			"class_definition",
			"enumeration",
			"events",
			"for_statement",
			"if_statement",
			"methods",
			"properties",
			"switch_statement",
			"try_statement",
			"while_statement",
		},
		ninja = {
			"build",
			"pool",
			"rule",
		},
		ocaml = {
			"application_expression",
			"do_clause",
			"external",
			"field_expression",
			"if_expression",
			"list_expression",
			"parenthesized_expression",
			"record_declaration",
			"record_expression",
			"try_expression",
			"type_binding",
			"value_specification",
		},
		pascal = {
			"arrInitializer",
			"block",
			"declArgs",
			"declClass",
			"declConsts",
			"declProc",
			"declTypes",
			"declUses",
			"declVars",
			"defaultValue",
			"exprArgs",
			"exprBrackets",
			"exprParens",
			"exprSubscript",
			"recInitializer",
			"statement",
		},
		php = {
			"arguments",
			"array_creation_expression",
			"binary_expression",
			"case_statement",
			"compound_statement",
			"declaration_list",
			"default_statement",
			"enum_declaration_list",
			"formal_parameters",
			"match_block",
			"member_call_expression",
			"parenthesized_expression",
			"return_statement",
			"switch_block",
		},
		python = {
			"binary_operator",
			"case_clause",
			"concatenated_string",
			"for_statement",
			"generator_expression",
			"if_statement",
			"import_from_statement",
			"lambda",
			"list_pattern",
			"match_statement",
			"parenthesized_expression",
			"try_statement",
			"tuple_pattern",
			"while_statement",
			"with_statement",
		},
		query = {
			"list",
			"predicate",
		},
		r = {
			"brace_list",
			"call",
			"paren_list",
			"pipe",
			"special",
		},
		readline = {
			"conditional_construct",
		},
		ruby = {
			"argument_list",
			"array",
			"assignment",
			"begin",
			"call",
			"case",
			"for",
			"hash",
			"if",
			"module",
			"parenthesized_statements",
			"singleton_class",
			"singleton_method",
			"unless",
			"until",
			"while",
		},
		rust = {
			"arguments",
			"array_expression",
			"assignment_expression",
			"call_expression",
			"enum_variant_list",
			"field_declaration_list",
			"macro_definition",
			"match_block",
			"mod_item",
			"ordered_field_declaration_list",
			"parameters",
			"struct_expression",
			"struct_pattern",
			"token_repetition",
			"token_tree",
			"trait_item",
			"tuple_expression",
			"tuple_pattern",
			"tuple_struct_pattern",
			"tuple_type",
			"use_list",
			"where_clause",
		},
		scss = {
			"block",
			"declaration",
			"each_statement",
			"mixin_statement",
			"while_statement",
		},
		sql = {
			"case",
			"column_definitions",
			"cte",
			"insert",
			"select",
			"subquery",
			"when_clause",
		},
		ssh_config = {
			"host_declaration",
			"match_declaration",
		},
		swift = {
			"array_literal",
			"array_type",
			"assignment",
			"call_expression",
			"class_body",
			"computed_getter",
			"computed_property",
			"computed_setter",
			"control_transfer_statement",
			"deinit_declaration",
			"dictionary_literal",
			"dictionary_type",
			"didset_clause",
			"enum_class_body",
			"init_declaration",
			"lambda_literal",
			"protocol_body",
			"subscript_declaration",
			"tuple_expression",
			"tuple_type",
			"type_parameters",
			"willset_clause",
			"willset_didset_block",
		},
		tablegen = {
			"assert",
			"value_suffix",
		},
		tcl = {
			"braced_word_simple",
			"command",
			"command_substitution",
			"conditional",
			"foreach",
			"namespace",
			"procedure",
			"try",
			"while",
		},
		teal = {
			"record_declaration",
			"function_body",
			"table_constructor",
			"return_statement",
			"while_statement",
		},
		terraform = {
			"block",
			"function_call",
			"object",
			"tuple",
		},
		textproto = {
			"message_list",
			"message_value",
			"scalar_list",
		},
		toml = {
			"array",
			"inline_table",
		},
		typescript = {
			"arguments",
			"array",
			"binary_expression",
			"call_expression",
			"class_body",
			"enum_declaration",
			"export_clause",
			"formal_parameters",
			"interface_declaration",
			"named_imports",
			"object",
			"object_pattern",
			"object_type",
			"parenthesized_expression",
			"return_statement",
			"switch_case",
			"switch_default",
			"switch_statement",
			"template_substitution",
			"ternary_expression",
		},
		vue = {
			"start_tag",
		},
		xml = {
			"element",
		},
		zig = {
			"Block",
			"ContainerDecl",
			"InitList",
			"SwitchExpr",
		},
	}

	require("modules.utils").load_plugin("ibl", {
		enabled = true,
		debounce = 200,
		indent = {
			char = "│",
			tab_char = "│",
			smart_indent_cap = true,
			priority = 2,
		},
		whitespace = { remove_blankline_trail = true },
		-- Note: The `scope` field requires treesitter to be set up
		scope = {
			enabled = true,
			char = "┃",
			show_start = false,
			show_end = false,
			injected_languages = true,
			priority = 1000,
			include = {
				node_type = {
					angular = nodes.html,
					arduino = nodes.cpp,
					astro = nodes.html,
					bibtex = nodes.bibtex,
					c = nodes.c,
					cmake = nodes.cmake,
					cpp = nodes.cpp,
					css = nodes.css,
					cuda = nodes.cpp,
					d = nodes.d,
					dart = nodes.dart,
					dot = nodes.dot,
					ecma = nodes.ecma,
					elixir = nodes.elixir,
					firrtl = nodes.firrtl,
					fortran = nodes.fortran,
					glsl = nodes.c,
					gleam = nodes.gleam,
					go = nodes.go,
					hlsl = nodes.cpp,
					html = nodes.html,
					java = nodes.java,
					javascript = nodes.javascript,
					julia = nodes.julia,
					just = nodes.just,
					linkerscript = nodes.linkerscript,
					lua = nodes.lua,
					luau = nodes.lua,
					matlab = nodes.matlab,
					ninja = nodes.ninja,
					objc = nodes.c,
					ocaml = nodes.ocaml,
					ocaml_interface = nodes.ocaml,
					pascal = nodes.pascal,
					php = nodes.php,
					python = nodes.python,
					query = nodes.query,
					r = nodes.r,
					readline = nodes.readline,
					ruby = nodes.ruby,
					rust = nodes.rust,
					scss = nodes.scss,
					sql = nodes.sql,
					ssh_config = nodes.ssh_config,
					swift = nodes.swift,
					tablegen = nodes.tablegen,
					tcl = nodes.tcl,
					teal = nodes.teal,
					terraform = nodes.terraform,
					textproto = nodes.textproto,
					toml = nodes.toml,
					typescript = nodes.typescript,
					vue = nodes.vue,
					xml = nodes.xml,
					zig = nodes.zig,
				},
			},
		},
		exclude = {
			buftypes = {
				"help",
				"nofile",
				"prompt",
				"quickfix",
				"terminal",
			},
			filetypes = {
				"", -- for all buffers without a file type
				"alpha",
				"checkhealth",
				"dap-repl",
				"diff",
				"fugitive",
				"fugitiveblame",
				"git",
				"gitcommit",
				"help",
				"log",
				"markdown",
				"notify",
				"NvimTree",
				"Outline",
				"qf",
				"TelescopePrompt",
				"text",
				"toggleterm",
				"undotree",
				"vimwiki",
			},
		},
	})
end
