aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNAKAI Tsuyoshi <82267684+uga-rosa@users.noreply.github.com>2023-04-11 23:28:46 +0900
committerGitHub <noreply@github.com>2023-04-11 16:28:46 +0200
commit9e86f473e0f4e21c5f40bf990c53194d593a0f9f (patch)
tree39f52084142ee87eb1e23a0aaa04eb337bca8f93
parentaab95ec67e4d80e63cc5c5acc42f3832e76e0781 (diff)
downloadrneovim-9e86f473e0f4e21c5f40bf990c53194d593a0f9f.tar.gz
rneovim-9e86f473e0f4e21c5f40bf990c53194d593a0f9f.tar.bz2
rneovim-9e86f473e0f4e21c5f40bf990c53194d593a0f9f.zip
feat(lua): vim.region accepts getpos() arg (#22635)
-rw-r--r--runtime/doc/lua.txt7
-rw-r--r--runtime/doc/news.txt2
-rw-r--r--runtime/lua/vim/_editor.lua22
-rw-r--r--runtime/lua/vim/highlight.lua19
-rw-r--r--test/functional/lua/vim_spec.lua4
5 files changed, 33 insertions, 21 deletions
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt
index 6084a625ba..2424c73f8f 100644
--- a/runtime/doc/lua.txt
+++ b/runtime/doc/lua.txt
@@ -1516,9 +1516,10 @@ region({bufnr}, {pos1}, {pos2}, {regtype}, {inclusive}) *vim.region()*
Parameters: ~
• {bufnr} (integer) number of buffer
- • {pos1} integer[] (line, column) tuple marking beginning of
- region
- • {pos2} integer[] (line, column) tuple marking end of region
+ • {pos1} integer[]|string start of region as a (line, column)
+ tuple or string accepted by |getpos()|
+ • {pos2} integer[]|string end of region as a (line, column) tuple
+ or string accepted by |getpos()|
• {regtype} (string) type of selection, see |setreg()|
• {inclusive} (boolean) indicating whether column of pos2 is inclusive
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index 6e2a1b1d3f..a9a80ed002 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -30,7 +30,7 @@ CHANGED FEATURES *news-changed*
The following changes to existing APIs or features add new behavior.
-• ...
+• |vim.region()| can use a string accepted by |getpos()| as position.
==============================================================================
REMOVED FEATURES *news-removed*
diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua
index fa0980563a..c922ec93db 100644
--- a/runtime/lua/vim/_editor.lua
+++ b/runtime/lua/vim/_editor.lua
@@ -402,8 +402,8 @@ end
--- Input and output positions are (0,0)-indexed and indicate byte positions.
---
---@param bufnr integer number of buffer
----@param pos1 integer[] (line, column) tuple marking beginning of region
----@param pos2 integer[] (line, column) tuple marking end of region
+---@param pos1 integer[]|string start of region as a (line, column) tuple or string accepted by |getpos()|
+---@param pos2 integer[]|string end of region as a (line, column) tuple or string accepted by |getpos()|
---@param regtype string type of selection, see |setreg()|
---@param inclusive boolean indicating whether column of pos2 is inclusive
---@return table region Table of the form `{linenr = {startcol,endcol}}`.
@@ -414,6 +414,24 @@ function vim.region(bufnr, pos1, pos2, regtype, inclusive)
vim.fn.bufload(bufnr)
end
+ if type(pos1) == 'string' then
+ local pos = vim.fn.getpos(pos1)
+ pos1 = { pos[2] - 1, pos[3] - 1 + pos[4] }
+ end
+ if type(pos2) == 'string' then
+ local pos = vim.fn.getpos(pos2)
+ pos2 = { pos[2] - 1, pos[3] - 1 + pos[4] }
+ end
+
+ if pos1[1] > pos2[1] or (pos1[1] == pos2[1] and pos1[2] > pos2[2]) then
+ pos1, pos2 = pos2, pos1
+ end
+
+ -- getpos() may return {0,0,0,0}
+ if pos1[1] < 0 or pos1[2] < 0 then
+ return {}
+ end
+
-- check that region falls within current buffer
local buf_line_count = vim.api.nvim_buf_line_count(bufnr)
pos1[1] = math.min(pos1[1], buf_line_count - 1)
diff --git a/runtime/lua/vim/highlight.lua b/runtime/lua/vim/highlight.lua
index d71a806ea8..a6cfcb730f 100644
--- a/runtime/lua/vim/highlight.lua
+++ b/runtime/lua/vim/highlight.lua
@@ -15,8 +15,8 @@ M.priorities = {
---@param bufnr integer Buffer number to apply highlighting to
---@param ns integer Namespace to add highlight to
---@param higroup string Highlight group to use for highlighting
----@param start { [1]: integer, [2]: integer } Start position {line, col}
----@param finish { [1]: integer, [2]: integer } Finish position {line, col}
+---@param start integer[]|string Start of region as a (line, column) tuple or string accepted by |getpos()|
+---@param finish integer[]|string End of region as a (line, column) tuple or string accepted by |getpos()|
---@param opts table|nil Optional parameters
-- - regtype type of range (see |setreg()|, default charwise)
-- - inclusive boolean indicating whether the range is end-inclusive (default false)
@@ -27,11 +27,6 @@ function M.range(bufnr, ns, higroup, start, finish, opts)
local inclusive = opts.inclusive or false
local priority = opts.priority or M.priorities.user
- -- sanity check
- if start[2] < 0 or finish[1] < start[1] then
- return
- end
-
local region = vim.region(bufnr, start, finish, regtype, inclusive)
for linenr, cols in pairs(region) do
local end_row
@@ -104,18 +99,12 @@ function M.on_yank(opts)
yank_timer:close()
end
- local pos1 = vim.fn.getpos("'[")
- local pos2 = vim.fn.getpos("']")
-
- pos1 = { pos1[2] - 1, pos1[3] - 1 + pos1[4] }
- pos2 = { pos2[2] - 1, pos2[3] - 1 + pos2[4] }
-
M.range(
bufnr,
yank_ns,
higroup,
- pos1,
- pos2,
+ "'[",
+ "']",
{ regtype = event.regtype, inclusive = event.inclusive, priority = M.priorities.user }
)
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
index 45d9263c0c..85e45788e8 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -2297,6 +2297,10 @@ describe('lua stdlib', function()
insert([[αα]])
eq({0,5}, exec_lua[[ return vim.region(0,{0,0},{0,4},'3',true)[0] ]])
end)
+ it('getpos() input', function()
+ insert('getpos')
+ eq({0,6}, exec_lua[[ return vim.region(0,{0,0},'.','v',true)[0] ]])
+ end)
end)
describe('vim.on_key', function()