use crate::finder::FuzzyKind;
use crate::mode::Mode;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Token {
Count(u32),
Op(Operator),
SelfDouble(Operator),
Motion(MotionKind),
Direct(DirectKind),
Scope(Scope),
Object(Object),
LeaderPrefix,
GotoPrefix,
ZPrefix,
FindCharPrefix { forward: bool, till: bool },
ReplaceCharPrefix,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Operator {
Delete,
Yank,
Change,
Indent,
Dedent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MotionKind {
Left,
Right,
Up,
Down,
LineStart,
LineEnd,
LineFirstNonBlank,
LineLastNonBlank,
WordForward,
WordBack,
WordEnd,
BigWordForward,
BigWordBack,
BigWordEnd,
WordEndBack,
BigWordEndBack,
FindChar {
ch: char,
forward: bool,
till: bool,
},
RepeatFind { reverse: bool },
FileStart,
FileEnd,
BracketMatch,
SearchWordForward,
SearchWordBack,
ViewportTop,
ViewportMiddle,
ViewportBottom,
HalfPageDown,
HalfPageUp,
PageDown,
PageUp,
SearchNext,
SearchPrev,
ParagraphBack,
ParagraphForward,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Scope {
Inner,
Around,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Object {
Word,
DoubleQuote,
SingleQuote,
Paren,
Brace,
Bracket,
Function,
Class,
Parameter,
Paragraph,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DirectKind {
EnterMode(Mode),
OpenPrompt(PromptKind),
OpenLineBelow,
OpenLineAbove,
AppendAfterCursor,
AppendAtLineEnd,
InsertAtLineStart,
ChangeToEol,
DeleteToEol,
YankLine,
JoinLines,
ToggleCase,
SubstituteChar,
SubstituteLine,
ViewportCenter,
ViewportTopAtCursor,
ViewportBottomAtCursor,
ReplaceChar { ch: char },
Paste,
Undo,
Redo,
DeleteCharUnderCursor,
Quit,
QuitForce,
BufferNext,
BufferPrev,
BufferDelete,
BufferDeleteForce,
BufferList,
SaveAndQuit,
Save,
Open,
GotoLine,
GotoDefinition,
GotoDeclaration,
GotoImplementation,
FindReferences,
Rename,
CodeAction,
Hover,
ToggleComment,
RepeatLast,
SearchSelectNext { reverse: bool },
SearchWordKeep { forward: bool },
ClearSearch,
MultiCursorAddNext,
MultiCursorPop,
MultiCursorClear,
JumpLabel,
SelectWholeBuffer,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PromptKind {
Command,
Search { forward: bool },
Fuzzy(FuzzyKind),
}
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Direct { kind: DirectKind, count: u32 },
Motion(MotionExpr),
Op {
op: Operator,
target: Target,
outer_count: u32,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MotionExpr {
pub motion: MotionKind,
pub count: u32,
}
#[derive(Debug, Clone, Copy)]
pub struct LastFind {
pub ch: char,
pub forward: bool,
pub till: bool,
}
#[derive(Debug, Clone)]
pub enum LastChange {
Expr(Expr),
Insert { trigger: Expr, keys: Vec<InsertKey> },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InsertKey {
Char(char),
Newline,
Backspace,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Target {
Motion(MotionExpr),
TextObject { scope: Scope, object: Object },
LineWise,
SearchMatch { reverse: bool },
}
#[derive(Debug, Clone, Copy)]
pub struct Ctx<'a> {
pub rest: &'a str,
#[allow(dead_code)]
pub count: u32,
}
impl<'a> Ctx<'a> {
pub fn with_rest(rest: &'a str) -> Self {
Self { rest, count: 1 }
}
}
impl Default for Ctx<'_> {
fn default() -> Self {
Self { rest: "", count: 1 }
}
}