Skip to content

Commit 5eb75ec

Browse files
jake-stewartstevearc
authored andcommitted
support multicursor.nvim
1 parent 09a4e4f commit 5eb75ec

File tree

1 file changed

+45
-16
lines changed

1 file changed

+45
-16
lines changed

lua/oil/view.lua

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,32 @@ local function get_first_mutable_column_col(adapter, ranges)
257257
return min_col
258258
end
259259

260+
--- @param bufnr integer
261+
--- @param adapter oil.Adapter
262+
--- @param mode false|"name"|"editable"
263+
--- @param cur integer[]
264+
--- @return integer[] | nil
265+
local function calc_constrained_cursor_pos(bufnr, adapter, mode, cur)
266+
local parser = require("oil.mutator.parser")
267+
local line = vim.api.nvim_buf_get_lines(bufnr, cur[1] - 1, cur[1], true)[1]
268+
local column_defs = columns.get_supported_columns(adapter)
269+
local result = parser.parse_line(adapter, line, column_defs)
270+
if result and result.ranges then
271+
local min_col
272+
if mode == "editable" then
273+
min_col = get_first_mutable_column_col(adapter, result.ranges)
274+
elseif mode == "name" then
275+
min_col = result.ranges.name[1]
276+
else
277+
error(string.format('Unexpected value "%s" for option constrain_cursor', mode))
278+
end
279+
if cur[2] < min_col then
280+
return { cur[1], min_col }
281+
end
282+
end
283+
end
284+
285+
260286
---Force cursor to be after hidden/immutable columns
261287
---@param bufnr integer
262288
---@param mode false|"name"|"editable"
@@ -267,30 +293,33 @@ local function constrain_cursor(bufnr, mode)
267293
if bufnr ~= vim.api.nvim_get_current_buf() then
268294
return
269295
end
270-
local parser = require("oil.mutator.parser")
271296

272297
local adapter = util.get_adapter(bufnr, true)
273298
if not adapter then
274299
return
275300
end
276301

277-
local cur = vim.api.nvim_win_get_cursor(0)
278-
local line = vim.api.nvim_buf_get_lines(bufnr, cur[1] - 1, cur[1], true)[1]
279-
local column_defs = columns.get_supported_columns(adapter)
280-
local result = parser.parse_line(adapter, line, column_defs)
281-
if result and result.ranges then
282-
local min_col
283-
if mode == "editable" then
284-
min_col = get_first_mutable_column_col(adapter, result.ranges)
285-
elseif mode == "name" then
286-
min_col = result.ranges.name[1]
287-
else
288-
error(string.format('Unexpected value "%s" for option constrain_cursor', mode))
289-
end
290-
if cur[2] < min_col then
291-
vim.api.nvim_win_set_cursor(0, { cur[1], min_col })
302+
local mc = package.loaded["multicursor-nvim"]
303+
if mc then
304+
mc.onSafeState(function()
305+
mc.action(function(ctx)
306+
ctx:forEachCursor(function(cursor)
307+
local new_cur = calc_constrained_cursor_pos(
308+
bufnr, adapter, mode, { cursor:line(), cursor:col() - 1 })
309+
if new_cur then
310+
cursor:setPos({new_cur[1], new_cur[2] + 1})
311+
end
312+
end)
313+
end)
314+
end, { once = true })
315+
else
316+
local cur = vim.api.nvim_win_get_cursor(0)
317+
local new_cur = calc_constrained_cursor_pos(bufnr, adapter, mode, cur)
318+
if new_cur then
319+
vim.api.nvim_win_set_cursor(0, new_cur)
292320
end
293321
end
322+
294323
end
295324

296325
---Redraw original path virtual text for trash buffer

0 commit comments

Comments
 (0)