diff --git a/lua/keymaps.lua b/lua/keymaps.lua index 4f1cec1..2400b26 100644 --- a/lua/keymaps.lua +++ b/lua/keymaps.lua @@ -57,3 +57,5 @@ vim.keymap.set({ "n", "v" }, "cbf", function() vim.b[0].disable_autoformat = true end end, { desc = "Disable autoformat on save buffer" }) + +vim.keymap.set("i", "", require("scripts.intellitab").indent) diff --git a/lua/scripts/intellitab.lua b/lua/scripts/intellitab.lua index 7a0a991..9e56790 100644 --- a/lua/scripts/intellitab.lua +++ b/lua/scripts/intellitab.lua @@ -7,66 +7,66 @@ local v = vim.api local treesitter = require("nvim-treesitter") local function get_line_indent(line, sw) - local indent = 0 + local indent = 0 - for c in line:gmatch("%s") do - if c == "\t" then - indent = indent + sw - else - indent = indent + 1 - end - end + for c in line:gmatch("%s") do + if c == "\t" then + indent = indent + sw + else + indent = indent + 1 + end + end - return indent + return indent end local function indent() - local cursor = v.nvim_win_get_cursor(0) - local line = v.nvim_buf_get_lines(0, cursor[1] - 1, cursor[1], false)[1] + local cursor = v.nvim_win_get_cursor(0) + local line = v.nvim_buf_get_lines(0, cursor[1] - 1, cursor[1], false)[1] - local indentexpr = v.nvim_buf_get_option(0, "indentexpr") - local expand = v.nvim_buf_get_option(0, "expandtab") - local shiftwidth = v.nvim_eval("shiftwidth()") - local tab_char = v.nvim_replace_termcodes("", true, true, true) - local indent_goal + local indentexpr = v.nvim_get_option_value("indentexpr", { buf = 0 }) + local expand = v.nvim_get_option_value("expandtab", { buf = 0 }) + local shiftwidth = v.nvim_eval("shiftwidth()") + local tab_char = v.nvim_replace_termcodes("", true, true, true) + local indent_goal - if treesitter ~= nil and treesitter.get_indent ~= nil then - indent_goal = treesitter.get_indent(line) - end + if treesitter ~= nil and treesitter.get_indent ~= nil then + indent_goal = treesitter.get_indent(line) + end - if indent_goal == nil or indent_goal < 0 then - if indentexpr ~= "" then - indent_goal = v.nvim_eval(indentexpr) - elseif v.nvim_buf_get_option(0, "cindent") then - indent_goal = v.nvim_call_function("cindent", { cursor[1] }) - else - indent_goal = v.nvim_call_function("indent", { cursor[1] }) - end - end + if indent_goal == nil or indent_goal < 0 then + if indentexpr ~= "" then + indent_goal = v.nvim_eval(indentexpr) + elseif v.nvim_get_option_value("cindent", { buf = 0 }) then + indent_goal = v.nvim_call_function("cindent", { cursor[1] }) + else + indent_goal = v.nvim_call_function("indent", { cursor[1] }) + end + end - if indent_goal == -1 and cursor[1] ~= 1 then - local prev_line = v.nvim_buf_get_lines(0, cursor[1] - 2, cursor[1] - 1, false)[1] - indent_goal = get_line_indent(prev_line, shiftwidth) - end + if indent_goal == -1 and cursor[1] ~= 1 then + local prev_line = v.nvim_buf_get_lines(0, cursor[1] - 2, cursor[1] - 1, false)[1] + indent_goal = get_line_indent(prev_line, shiftwidth) + end - -- Reset the cursor, since the functions are free to move it - v.nvim_win_set_cursor(0, cursor) + -- Reset the cursor, since the functions are free to move it + v.nvim_win_set_cursor(0, cursor) - if cursor[2] == 0 and line == "" and indent_goal ~= nil and indent_goal > 0 then - local i = 0 - while i < indent_goal do - if expand then - v.nvim_feedkeys(" ", "n", true) - i = i + 1 - else - v.nvim_feedkeys(tab_char, "n", true) - i = i + shiftwidth - end - end - print(i, indent_goal) - else - v.nvim_feedkeys(tab_char, "n", true) - end + if cursor[2] == 0 and line == "" and indent_goal ~= nil and indent_goal > 0 then + local i = 0 + while i < indent_goal do + if expand then + v.nvim_feedkeys(" ", "n", true) + i = i + 1 + else + v.nvim_feedkeys(tab_char, "n", true) + i = i + shiftwidth + end + end + print(i, indent_goal) + else + v.nvim_feedkeys(tab_char, "n", true) + end end return { indent = indent }