feat: [hx] add group function to move cursor beyond eol
In Helix, F, T, t, f bring the cursor to the character being searched for, if not found, the cursor is not moved at all.
This commit is contained in:
		
							parent
							
								
									b70cf4cea7
								
							
						
					
					
						commit
						151f108b80
					
				
					 1 changed files with 86 additions and 0 deletions
				
			
		|  | @ -418,6 +418,10 @@ const cmds_ = struct { | |||
|     pub const paste_clipboard_before_meta: Meta = .{ .description = "Paste from clipboard before selection" }; | ||||
| }; | ||||
| 
 | ||||
| fn move_cursor_find_egc_beyond_eol(root: Buffer.Root, cursor: *Cursor, ctx: command.Context, metrics: Buffer.Metrics, move: find_char_function) error{Stop}!void { | ||||
|     move(root, cursor, metrics, ctx); | ||||
| } | ||||
| 
 | ||||
| fn move_cursor_word_left_helix(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics) error{Stop}!void { | ||||
|     try Editor.move_cursor_left(root, cursor, metrics); | ||||
| 
 | ||||
|  | @ -449,6 +453,83 @@ fn move_cursor_word_right_end_helix(root: Buffer.Root, cursor: *Cursor, metrics: | |||
|     try cursor.move_right(root, metrics); | ||||
| } | ||||
| 
 | ||||
| fn move_cursor_to_char_left_beyond_eol(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics, ctx: command.Context) error{Stop}!void { | ||||
|     var egc: []const u8 = undefined; | ||||
|     if (!(ctx.args.match(.{tp.extract(&egc)}) catch return error.Stop)) | ||||
|         return error.Stop; | ||||
|     var test_cursor = cursor.*; | ||||
|     try test_cursor.move_left(root, metrics); | ||||
|     while (true) { | ||||
|         const curr_egc, _, _ = root.egc_at(test_cursor.row, test_cursor.col, metrics) catch return error.Stop; | ||||
|         if (std.mem.eql(u8, curr_egc, egc)) { | ||||
|             cursor.row = test_cursor.row; | ||||
|             cursor.col = test_cursor.col; | ||||
|             cursor.target = cursor.col; | ||||
|             return; | ||||
|         } | ||||
|         test_cursor.move_left(root, metrics) catch return error.Stop; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn move_cursor_to_char_right_beyond_eol(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics, ctx: command.Context) error{Stop}!void { | ||||
|     var egc: []const u8 = undefined; | ||||
|     if (!(ctx.args.match(.{tp.extract(&egc)}) catch return error.Stop)) | ||||
|         return error.Stop; | ||||
|     var test_cursor = cursor.*; | ||||
|     while (true) { | ||||
|         const curr_egc, _, _ = root.egc_at(test_cursor.row, test_cursor.col, metrics) catch return error.Stop; | ||||
|         if (std.mem.eql(u8, curr_egc, egc)) { | ||||
|             cursor.row = test_cursor.row; | ||||
|             cursor.col = test_cursor.col; | ||||
|             cursor.target = cursor.col; | ||||
|             return; | ||||
|         } | ||||
|         test_cursor.move_right(root, metrics) catch return error.Stop; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn move_cursor_till_char_left_beyond_eol(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics, ctx: command.Context) error{Stop}!void { | ||||
|     var egc: []const u8 = undefined; | ||||
|     if (!(ctx.args.match(.{tp.extract(&egc)}) catch return error.Stop)) | ||||
|         return error.Stop; | ||||
|     var test_cursor = cursor; | ||||
|     try test_cursor.move_left(root, metrics); | ||||
|     var prev = test_cursor.*; | ||||
|     try prev.move_left(root, metrics); | ||||
|     while (true) { | ||||
|         const prev_egc, _, _ = root.egc_at(prev.row, prev.col, metrics) catch return error.Stop; | ||||
|         if (std.mem.eql(u8, prev_egc, egc)) { | ||||
|             cursor.row = test_cursor.row; | ||||
|             cursor.col = test_cursor.col; | ||||
|             cursor.target = cursor.col; | ||||
|             return; | ||||
|         } | ||||
|         test_cursor.move_left(root, metrics) catch return error.Stop; | ||||
|         prev.move_left(root, metrics) catch return error.Stop; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn move_cursor_till_char_right_beyond_eol(root: Buffer.Root, cursor: *Cursor, metrics: Buffer.Metrics, ctx: command.Context) error{Stop}!void { | ||||
|     var egc: []const u8 = undefined; | ||||
|     if (!(ctx.args.match(.{tp.extract(&egc)}) catch return error.Stop)) | ||||
|         return error.Stop; | ||||
|     var test_cursor = cursor; | ||||
|     try test_cursor.move_right(root, metrics); | ||||
|     var next = test_cursor.*; | ||||
|     try next.move_right(root, metrics); | ||||
|     while (true) { | ||||
|         const next_egc, _, _ = root.egc_at(next.row, next.col, metrics) catch return error.Stop; | ||||
|         if (std.mem.eql(u8, next_egc, egc)) { | ||||
|             cursor.row = test_cursor.row; | ||||
|             cursor.col = test_cursor.col; | ||||
|             cursor.target = cursor.col; | ||||
|             return; | ||||
|         } | ||||
|         test_cursor.move_right(root, metrics) catch return error.Stop; | ||||
|         next.move_right(root, metrics) catch return error.Stop; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn insert_before(editor: *Editor, root: Buffer.Root, cursel: *CurSel, text: []const u8, allocator: Allocator) !Buffer.Root { | ||||
|     var root_: Buffer.Root = root; | ||||
|     const cursor: *Cursor = &cursel.cursor; | ||||
|  | @ -607,6 +688,7 @@ fn move_cursor_long_word_right_end(root: Buffer.Root, cursor: *Cursor, metrics: | |||
| } | ||||
| 
 | ||||
| const pasting_function = @TypeOf(insert_before); | ||||
| const find_char_function = @TypeOf(move_cursor_to_char_left_beyond_eol); | ||||
| 
 | ||||
| fn paste_helix(ctx: command.Context, do_paste: pasting_function) command.Result { | ||||
|     const mv = tui.mainview() orelse return; | ||||
|  | @ -670,6 +752,10 @@ pub const test_internal = struct { | |||
|     pub const move_cursor_long_word_right_end = private.move_cursor_long_word_right_end; | ||||
|     pub const move_cursor_word_left_helix = private.move_cursor_word_left_helix; | ||||
|     pub const move_cursor_word_right_end_helix = private.move_cursor_word_right_end_helix; | ||||
|     pub const move_cursor_to_char_left_beyond_eol = private.move_cursor_to_char_left_beyond_eol; | ||||
|     pub const move_cursor_to_char_right_beyond_eol = private.move_cursor_to_char_right_beyond_eol; | ||||
|     pub const move_cursor_till_char_left_beyond_eol = private.move_cursor_till_char_left_beyond_eol; | ||||
|     pub const move_cursor_till_char_right_beyond_eol = private.move_cursor_till_char_right_beyond_eol; | ||||
|     pub const insert_before = private.insert_before; | ||||
|     pub const insert_replace_selection = private.insert_replace_selection; | ||||
|     pub const insert_after = private.insert_after; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue