diff --git a/init.lua b/init.lua index b5d710b..593f4da 100644 --- a/init.lua +++ b/init.lua @@ -2,4 +2,43 @@ require("config.options") require("config.keymaps") require("config.lazy") require("custom.functions") --- require("custom.chatgpt") +local viewgroup = vim.api.nvim_create_augroup("RememberFolds", { clear = true }) + +local allowed_rem_filetypes = { + lua = true, + python = true, + r = true, + bash = true, + c = true, + sql = true, + ["c++"] = true, -- in case filetype is "c++" + cpp = true, -- sometimes C++ is "cpp" + java = true, + rust = true, + go = true, +} + +vim.api.nvim_create_autocmd("BufWinLeave", { + group = viewgroup, + pattern = "*", + callback = function() + -- Exclude terminal and Telescope buffers from mkview + local ft = vim.bo.filetype:lower() + if not allowed_rem_filetypes[ft] then + return + end + vim.cmd("mkview") + end, +}) +vim.api.nvim_create_autocmd("BufWinEnter", { + group = viewgroup, + pattern = "*", + callback = function() + -- Exclude terminal and Telescope buffers from loadview + local ft = vim.bo.filetype:lower() + if not allowed_rem_filetypes[ft] then + return + end + vim.cmd("silent! loadview") + end, +}) diff --git a/lua/config/keymaps.lua b/lua/config/keymaps.lua index 6f1510d..013b0f5 100644 --- a/lua/config/keymaps.lua +++ b/lua/config/keymaps.lua @@ -20,3 +20,9 @@ vim.keymap.set('n', 'z7', 'Telescope spell_suggest', { noremap = true, vim.keymap.set('n', '', ':set ignorecase!', { noremap = true, silent = true }) vim.keymap.set('n', '',':set spell! spelllang=hu', { noremap = true, silent = true }) vim.keymap.set('n', '',':set spell! spelllang=en', { noremap = true, silent = true }) +vim.api.nvim_set_keymap( + "n", + "lf", + "lua require('custom.fold_telescope').jump_to_fold_starts()", + { noremap = true, silent = true } +) diff --git a/lua/custom/fold_telescope.lua b/lua/custom/fold_telescope.lua new file mode 100644 index 0000000..5eddaca --- /dev/null +++ b/lua/custom/fold_telescope.lua @@ -0,0 +1,69 @@ +local pickers = require("telescope.pickers") +local finders = require("telescope.finders") +local conf = require("telescope.config").values +local actions = require("telescope.actions") +local action_state = require("telescope.actions.state") + +-- Utility: Given a line number, returns the fold's starting line. +local function get_fold_start(l) + local closed = vim.fn.foldclosed(l) + if closed ~= -1 then + return closed + else + local level = vim.fn.foldlevel(l) + if level == 0 then + return l + end + local start = l + while start > 1 and vim.fn.foldlevel(start - 1) >= level do + start = start - 1 + end + return start + end +end + +local function jump_to_fold_starts() + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) + local entries = {} + local prev_level = 0 + + -- Detect fold-start lines by checking if foldlevel increases. + for i, line in ipairs(lines) do + local current_level = vim.fn.foldlevel(i) + if current_level > prev_level then + table.insert(entries, { + value = line, + display = string.format("%d: %s", i, line), + ordinal = line, + file_line = i, -- Save the actual file line number. + }) + end + prev_level = current_level + end + + pickers.new({}, { + prompt_title = "Fold Starts", + finder = finders.new_table { + results = entries, + entry_maker = function(entry) + return entry -- Already in the expected shape. + end, + }, + sorter = conf.generic_sorter({}), + attach_mappings = function(prompt_bufnr, _) + actions.select_default:replace(function() + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + if selection then + local target_line = get_fold_start(selection.file_line) + vim.cmd(string.format("normal! %dG", target_line)) + vim.cmd("normal! zv") + end + end) + return true + end, + }):find() +end + +-- Expose the function so you can require it. +return { jump_to_fold_starts = jump_to_fold_starts } diff --git a/lua/custom/functions.lua b/lua/custom/functions.lua index 40f69f0..634d9c4 100644 --- a/lua/custom/functions.lua +++ b/lua/custom/functions.lua @@ -4,7 +4,6 @@ local function lines_with_preview() local fzf_command = string.format("call fzf#vim#grep('%s', 1, fzf#vim#with_preview({'options': '--delimiter : --nth 4.. --no-sort'}, 'up:50%%', '?'), 1)", rg_command) vim.cmd(fzf_command) end - function DevtoolsPath() local devPath = vim.fn.trim(vim.fn.system('ls ' .. vim.fn.expand("%:p:h") .. ' | grep DESCRIPTION'))