use strop_core::Range;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Op {
Delete,
Yank,
Change,
Indent,
Dedent,
}
impl Op {
pub fn name(self) -> &'static str {
match self {
Op::Delete => "delete",
Op::Yank => "yank",
Op::Change => "change",
Op::Indent => "indent",
Op::Dedent => "dedent",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Motion {
Left,
Down,
Up,
Right,
WordForward,
WordBackward,
WordEnd,
LineStart,
LineEnd,
FirstLine,
LastLine,
FindChar {
ch: u8,
till: bool,
backward: bool,
},
Search(String),
SearchBackward(String),
BigWordForward,
BigWordBackward,
BigWordEnd,
MatchPair,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Object {
Word,
Quote(u8),
Bracket { open: u8, close: u8 },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Target {
Motion(Motion),
Object {
inner: bool,
obj: Object,
},
Linewise,
SurroundDelete(u8),
SurroundChange {
from: u8,
to: u8,
},
SurroundAdd {
ch: u8,
inner: Box<Target>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Command {
pub op: Option<Op>,
pub register: Option<char>,
pub count: usize,
pub target: Target,
pub keys: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Parse {
Incomplete,
Invalid,
Complete(Command),
}
#[derive(Debug, Clone)]
pub struct Resolved {
pub range: Range,
pub inclusive: bool,
pub spec: String,
}