From abfd6f521a7d8aad54f328aa1f2df593604f7b99 Mon Sep 17 00:00:00 2001 From: numToStr Date: Sun, 30 Jan 2022 20:41:10 +0530 Subject: [PATCH 1/2] fix: marks disappears after comment/uncomment Using `nvim_buf_set_lines` destroys the marks within the comment/uncomment region. To prevent that I am now wrapping API function with `lockmarks` which will preserve the marks inside the region. Fixes #24 #76 --- lua/Comment/api.lua | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/lua/Comment/api.lua b/lua/Comment/api.lua index 9223e827..05f45221 100644 --- a/lua/Comment/api.lua +++ b/lua/Comment/api.lua @@ -188,12 +188,26 @@ end -------------- ADDITIONAL API -------------- -------------------------------------------- ----Callback function to provide dot-repeat support and store last cursor position +---Wraps API function with `lockmarks` to preserve marks while changing text/lines +C.locked = setmetatable({}, { + __index = function(_, cb) + ---Actual function which will be attached to operatorfunc + ---@param vmode VMode + return function(vmode) + return A.nvim_command(string.format([[lockmarks lua require('Comment.api').%s("%s")]], cb, vmode)) + end + end, +}) + +---Callback function which does the following +--- 1. Prevides dot-repeat support +--- 2. Preserves jumps and marks +--- 3. Store last cursor position ---NOTE: We are using `config` to store the position as it is a kinda global ---@param cb string Name of the API function to call function C.call(cb) local cfg = Config:get() - A.nvim_set_option('operatorfunc', "v:lua.require'Comment.api'." .. cb) + A.nvim_set_option('operatorfunc', string.format("v:lua.require'Comment.api'.locked.%s", cb)) cfg.__pos = cfg.sticky and A.nvim_win_get_cursor(0) end @@ -214,13 +228,13 @@ function C.setup(config) map( 'n', cfg.toggler.line, - [[v:count == 0 ? 'lua require("Comment.api").call("toggle_current_linewise_op")g@$' : 'lua require("Comment.api").toggle_linewise_count()']], + [[v:count == 0 ? 'lua require("Comment.api").call("toggle_current_linewise_op")g@$' : 'lua require("Comment.api").locked.toggle_linewise_count()']], expr ) map( 'n', cfg.toggler.block, - [[v:count == 0 ? 'lua require("Comment.api").call("toggle_current_blockwise_op")g@$' : 'lua require("Comment.api").toggle_blockwise_count()']], + [[v:count == 0 ? 'lua require("Comment.api").call("toggle_current_blockwise_op")g@$' : 'lua require("Comment.api").locked.toggle_blockwise_count()']], expr ) map('n', cfg.opleader.line, 'lua require("Comment.api").call("toggle_linewise_op")g@', map_opt) @@ -230,22 +244,22 @@ function C.setup(config) map( 'x', cfg.opleader.line, - 'lua require("Comment.api").toggle_linewise_op(vim.fn.visualmode())', + 'lua require("Comment.api").locked.toggle_linewise_op(vim.fn.visualmode())', map_opt ) map( 'x', cfg.opleader.block, - 'lua require("Comment.api").toggle_blockwise_op(vim.fn.visualmode())', + 'lua require("Comment.api").locked.toggle_blockwise_op(vim.fn.visualmode())', map_opt ) end -- Extra Mappings if cfg.mappings.extra then - map('n', cfg.extra.below, 'lua require("Comment.api").insert_linewise_below()', map_opt) - map('n', cfg.extra.above, 'lua require("Comment.api").insert_linewise_above()', map_opt) - map('n', cfg.extra.eol, 'lua require("Comment.api").insert_linewise_eol()', map_opt) + map('n', cfg.extra.below, 'lua require("Comment.api").locked.insert_linewise_below()', map_opt) + map('n', cfg.extra.above, 'lua require("Comment.api").locked.insert_linewise_above()', map_opt) + map('n', cfg.extra.eol, 'lua require("Comment.api").locked.insert_linewise_eol()', map_opt) end -- Extended Mappings @@ -260,11 +274,16 @@ function C.setup(config) map('n', 'glua require("Comment.api").call("uncomment_current_blockwise_op")g@$', map_opt) -- VISUAL mode extended - map('x', 'g>', 'lua require("Comment.api").comment_linewise_op(vim.fn.visualmode())', map_opt) + map( + 'x', + 'g>', + 'lua require("Comment.api").locked.comment_linewise_op(vim.fn.visualmode())', + map_opt + ) map( 'x', 'g<', - 'lua require("Comment.api").uncomment_linewise_op(vim.fn.visualmode())', + 'lua require("Comment.api").locked.uncomment_linewise_op(vim.fn.visualmode())', map_opt ) end From ac3739536ffb3eee651ee8748f1c96bb7d12a7bb Mon Sep 17 00:00:00 2001 From: numToStr Date: Tue, 1 Feb 2022 15:14:41 +0530 Subject: [PATCH 2/2] string.format --- lua/Comment/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/Comment/api.lua b/lua/Comment/api.lua index 05f45221..85f5bbdc 100644 --- a/lua/Comment/api.lua +++ b/lua/Comment/api.lua @@ -194,7 +194,7 @@ C.locked = setmetatable({}, { ---Actual function which will be attached to operatorfunc ---@param vmode VMode return function(vmode) - return A.nvim_command(string.format([[lockmarks lua require('Comment.api').%s("%s")]], cb, vmode)) + return A.nvim_command(('lockmarks lua require("Comment.api").%s("%s")'):format(cb, vmode)) end end, }) @@ -207,7 +207,7 @@ C.locked = setmetatable({}, { ---@param cb string Name of the API function to call function C.call(cb) local cfg = Config:get() - A.nvim_set_option('operatorfunc', string.format("v:lua.require'Comment.api'.locked.%s", cb)) + A.nvim_set_option('operatorfunc', ("v:lua.require'Comment.api'.locked.%s"):format(cb)) cfg.__pos = cfg.sticky and A.nvim_win_get_cursor(0) end