@@ -257,6 +257,32 @@ local function get_first_mutable_column_col(adapter, ranges)
257257 return min_col
258258end
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+
294323end
295324
296325--- Redraw original path virtual text for trash buffer
0 commit comments