commit 7499c9f9a754b5af052f2b61aeaf491045268f80
parent a4a690e59753360e72b00cc301a0e6f624b70123
Author: Yi Ming <ofseed@foxmail.com>
Date: Mon, 18 Aug 2025 20:56:17 +0800
feat(lua): conversion between cursor positions
Diffstat:
2 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt
@@ -3986,19 +3986,28 @@ comparisons and conversions between various types of positions.
as format conversions.
Fields: ~
- • {row} (`integer`) 0-based byte index.
- • {col} (`integer`) 0-based byte index.
- • {buf}? (`integer`) Optional buffer handle.
+ • {row} (`integer`) 0-based byte index.
+ • {col} (`integer`) 0-based byte index.
+ • {buf}? (`integer`) Optional buffer handle.
- When specified, it indicates that this position belongs to a
- specific buffer. This field is required when performing
- position conversions.
- • {to_lsp} (`fun(pos: vim.Pos, position_encoding: lsp.PositionEncodingKind)`)
- See |Pos:to_lsp()|.
- • {lsp} (`fun(buf: integer, pos: lsp.Position, position_encoding: lsp.PositionEncodingKind)`)
- See |Pos:lsp()|.
+ When specified, it indicates that this position belongs
+ to a specific buffer. This field is required when
+ performing position conversions.
+ • {to_lsp} (`fun(pos: vim.Pos, position_encoding: lsp.PositionEncodingKind)`)
+ See |Pos:to_lsp()|.
+ • {lsp} (`fun(buf: integer, pos: lsp.Position, position_encoding: lsp.PositionEncodingKind)`)
+ See |Pos:lsp()|.
+ • {to_cursor} (`fun(pos: vim.Pos): [integer, integer]`) See
+ |Pos:to_cursor()|.
+ • {cursor} (`fun(pos: [integer, integer])`) See |Pos:cursor()|.
+Pos:cursor({pos}) *Pos:cursor()*
+ Creates a new |vim.Pos| from cursor position.
+
+ Parameters: ~
+ • {pos} (`[integer, integer]`)
+
Pos:lsp({buf}, {pos}, {position_encoding}) *Pos:lsp()*
Creates a new |vim.Pos| from `lsp.Position`.
@@ -4018,6 +4027,15 @@ Pos:lsp({buf}, {pos}, {position_encoding}) *Pos:lsp()*
• {pos} (`lsp.Position`)
• {position_encoding} (`lsp.PositionEncodingKind`)
+Pos:to_cursor({pos}) *Pos:to_cursor()*
+ Converts |vim.Pos| to cursor position.
+
+ Parameters: ~
+ • {pos} (`vim.Pos`) See |vim.Pos|.
+
+ Return: ~
+ (`[integer, integer]`)
+
Pos:to_lsp({pos}, {position_encoding}) *Pos:to_lsp()*
Converts |vim.Pos| to `lsp.Position`.
diff --git a/runtime/lua/vim/pos.lua b/runtime/lua/vim/pos.lua
@@ -178,6 +178,19 @@ function Pos.lsp(buf, pos, position_encoding)
return Pos.new(row, col, { buf = buf })
end
+--- Converts |vim.Pos| to cursor position.
+---@param pos vim.Pos
+---@return [integer, integer]
+function Pos.to_cursor(pos)
+ return { pos.row + 1, pos.col }
+end
+
+--- Creates a new |vim.Pos| from cursor position.
+---@param pos [integer, integer]
+function Pos.cursor(pos)
+ return Pos.new(pos[1] - 1, pos[2])
+end
+
-- Overload `Range.new` to allow calling this module as a function.
setmetatable(Pos, {
__call = function(_, ...)