aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Aronoff <peter@aronoff.org>2024-11-17 16:31:24 -0500
committerGitHub <noreply@github.com>2024-11-17 13:31:24 -0800
commitcc6992f1ca443f4da01cb4d57159d4cef37b36b7 (patch)
tree3b51134d7e6190637daff3db1d274159118ed6e4
parent44229bb85b6cff00193164967126d85a7a785a7b (diff)
downloadrneovim-cc6992f1ca443f4da01cb4d57159d4cef37b36b7.tar.gz
rneovim-cc6992f1ca443f4da01cb4d57159d4cef37b36b7.tar.bz2
rneovim-cc6992f1ca443f4da01cb4d57159d4cef37b36b7.zip
feat(defaults): dot-repeat [<Space> #31186
Problem: `[<Space>` and `]<Space>` do not support repetition. Solution: use `operatorfunc` and `g@l` to make these mappings dot repeatable.
-rw-r--r--runtime/lua/vim/_buf.lua23
-rw-r--r--runtime/lua/vim/_defaults.lua16
-rw-r--r--test/functional/editor/defaults_spec.lua47
3 files changed, 78 insertions, 8 deletions
diff --git a/runtime/lua/vim/_buf.lua b/runtime/lua/vim/_buf.lua
new file mode 100644
index 0000000000..0631c96f77
--- /dev/null
+++ b/runtime/lua/vim/_buf.lua
@@ -0,0 +1,23 @@
+local M = {}
+
+--- Adds one or more blank lines above or below the cursor.
+-- TODO: move to _defaults.lua once it is possible to assign a Lua function to options #25672
+--- @param above? boolean Place blank line(s) above the cursor
+local function add_blank(above)
+ local offset = above and 1 or 0
+ local repeated = vim.fn['repeat']({ '' }, vim.v.count1)
+ local linenr = vim.api.nvim_win_get_cursor(0)[1]
+ vim.api.nvim_buf_set_lines(0, linenr - offset, linenr - offset, true, repeated)
+end
+
+-- TODO: move to _defaults.lua once it is possible to assign a Lua function to options #25672
+function M.space_above()
+ add_blank(true)
+end
+
+-- TODO: move to _defaults.lua once it is possible to assign a Lua function to options #25672
+function M.space_below()
+ add_blank()
+end
+
+return M
diff --git a/runtime/lua/vim/_defaults.lua b/runtime/lua/vim/_defaults.lua
index 25afd83145..06f6ed6829 100644
--- a/runtime/lua/vim/_defaults.lua
+++ b/runtime/lua/vim/_defaults.lua
@@ -366,16 +366,16 @@ do
-- Add empty lines
vim.keymap.set('n', '[<Space>', function()
- local repeated = vim.fn['repeat']({ '' }, vim.v.count1)
- local linenr = vim.api.nvim_win_get_cursor(0)[1]
- vim.api.nvim_buf_set_lines(0, linenr - 1, linenr - 1, true, repeated)
- end, { desc = 'Add empty line above cursor' })
+ -- TODO: update once it is possible to assign a Lua function to options #25672
+ vim.go.operatorfunc = "v:lua.require'vim._buf'.space_above"
+ return 'g@l'
+ end, { expr = true, desc = 'Add empty line above cursor' })
vim.keymap.set('n', ']<Space>', function()
- local repeated = vim.fn['repeat']({ '' }, vim.v.count1)
- local linenr = vim.api.nvim_win_get_cursor(0)[1]
- vim.api.nvim_buf_set_lines(0, linenr, linenr, true, repeated)
- end, { desc = 'Add empty line below cursor' })
+ -- TODO: update once it is possible to assign a Lua function to options #25672
+ vim.go.operatorfunc = "v:lua.require'vim._buf'.space_below"
+ return 'g@l'
+ end, { expr = true, desc = 'Add empty line below cursor' })
end
end
diff --git a/test/functional/editor/defaults_spec.lua b/test/functional/editor/defaults_spec.lua
index 7110d216f8..82d285cc9a 100644
--- a/test/functional/editor/defaults_spec.lua
+++ b/test/functional/editor/defaults_spec.lua
@@ -172,6 +172,30 @@ describe('default', function()
first line]])
end)
+
+ it('supports dot repetition', function()
+ n.clear({ args_rm = { '--cmd' } })
+ n.insert([[first line]])
+ n.feed('[<Space>')
+ n.feed('.')
+ n.expect([[
+
+
+ first line]])
+ end)
+
+ it('supports dot repetition and a count', function()
+ n.clear({ args_rm = { '--cmd' } })
+ n.insert([[first line]])
+ n.feed('[<Space>')
+ n.feed('3.')
+ n.expect([[
+
+
+
+
+ first line]])
+ end)
end)
describe(']<Space>', function()
@@ -196,6 +220,29 @@ describe('default', function()
]])
end)
+
+ it('supports dot repetition', function()
+ n.clear({ args_rm = { '--cmd' } })
+ n.insert([[first line]])
+ n.feed(']<Space>')
+ n.feed('.')
+ n.expect([[
+ first line
+
+ ]])
+ end)
+
+ it('supports dot repetition and a count', function()
+ n.clear({ args_rm = { '--cmd' } })
+ n.insert([[first line]])
+ n.feed(']<Space>')
+ n.feed('2.')
+ n.expect([[
+ first line
+
+
+ ]])
+ end)
end)
end)
end)