flow/src/tui/mode/mini/move_to_char.zig

72 lines
2 KiB
Zig

const std = @import("std");
const cbor = @import("cbor");
const command = @import("command");
const tui = @import("../../tui.zig");
pub const Type = @import("get_char.zig").Create(@This());
pub const create = Type.create;
pub const ValueType = struct {
direction: Direction,
operation_command: []const u8,
operation: Operation,
};
const Direction = enum {
left,
right,
};
const Operation = enum {
move,
select,
extend,
};
pub fn start(self: *Type) ValueType {
var operation_command: []const u8 = "move_to_char_left";
_ = self.ctx.args.match(.{cbor.extract(&operation_command)}) catch {};
const direction: Direction = if (std.mem.indexOf(u8, operation_command, "_left")) |_| .left else .right;
var operation: Operation = undefined;
if (std.mem.indexOf(u8, operation_command, "extend_")) |_| {
operation = .extend;
} else if (std.mem.indexOf(u8, operation_command, "select_")) |_| {
operation = .select;
} else if (tui.get_active_editor()) |editor| if (editor.get_primary().selection) |_| {
operation = .select;
} else {
operation = .move;
} else {
operation = .move;
}
return .{
.direction = direction,
.operation_command = operation_command,
.operation = operation,
};
}
pub fn name(self: *Type) []const u8 {
return switch (self.value.operation) {
.move => switch (self.value.direction) {
.left => "↶ move",
.right => "↷ move",
},
.select => switch (self.value.direction) {
.left => "󰒅 ↶ select",
.right => "󰒅 ↷ select",
},
.extend => switch (self.value.direction) {
.left => "󰒅 ↶ extend",
.right => "󰒅 ↷ extend",
},
};
}
pub fn process_egc(self: *Type, egc: []const u8) command.Result {
try command.executeName(self.value.operation_command, command.fmt(.{egc}));
try command.executeName("exit_mini_mode", .{});
}