mod buf_helpers;
mod buffer_impl;
mod discipline;
mod editor;
pub mod input;
pub mod keymap_motion;
pub mod motions;
mod registers;
pub mod search;
pub mod substitute;
pub mod types;
mod viewport_math;
pub mod vim;
pub use discipline::{DisciplineState, NoDiscipline};
pub use editor::{Editor, LspIntent, MarkJump, UndoGranularity};
pub use input::{Input, Key, decode_macro, from_planned as decode_planned_input};
pub use registers::{Registers, Slot};
pub use buffer_impl::{BufferFoldProvider, BufferFoldProviderMut};
pub use keymap_motion::MotionKind;
pub use substitute::{
SubstError, SubstFlags, SubstituteCmd, SubstituteMatch, SubstituteOutcome,
apply_collected_matches, apply_substitute, collect_substitute_matches, parse_substitute,
};
pub use types::{
Attrs, Buffer, BufferEdit, BufferId, Color, ContentEdit, Cursor, CursorShape, DefaultHost,
Edit, EditorSnapshot, EngineError, FoldOp, FoldProvider, Highlight, HighlightKind, Host,
Input as PlannedInput, Mode, Modifiers, MouseEvent, MouseKind, NoopFoldProvider, OptionValue,
Options, Pos, Query, RenderFrame, Search, Selection, SelectionKind, SelectionSet, SnapshotMode,
SpecialKey, Style, Viewport, WrapMode,
};
pub use vim::{
Abbrev, AbbrevTrigger, InsertDir, InsertEntry, InsertReason, InsertSession, LastChange,
LastVisual, Motion, Operator, Pending, RangeKind, ScrollDir, SearchPrompt, op_is_change,
parse_motion,
};
pub use vim::Mode as FsmMode;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum KeybindingMode {
#[default]
Vim,
Vscode,
}
impl KeybindingMode {
pub fn from_config(s: &str) -> Self {
match s {
"vscode" => KeybindingMode::Vscode,
_ => KeybindingMode::Vim,
}
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for KeybindingMode {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
match self {
KeybindingMode::Vim => s.serialize_str("vim"),
KeybindingMode::Vscode => s.serialize_str("vscode"),
}
}
}
#[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for KeybindingMode {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
let raw = String::deserialize(d)?;
Ok(KeybindingMode::from_config(&raw))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum VimMode {
#[default]
Normal,
Insert,
Visual,
VisualLine,
VisualBlock,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CoarseMode {
#[default]
Normal,
Insert,
Select,
SelectLine,
SelectBlock,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ViewMode {
#[default]
Normal,
Blame,
}
#[cfg(test)]
mod tests {
use super::KeybindingMode;
#[test]
fn from_config_vim_maps_to_vim() {
assert_eq!(KeybindingMode::from_config("vim"), KeybindingMode::Vim);
}
#[test]
fn from_config_vscode_maps_to_vscode() {
assert_eq!(
KeybindingMode::from_config("vscode"),
KeybindingMode::Vscode
);
}
#[test]
fn from_config_unknown_falls_back_to_vim() {
assert_eq!(KeybindingMode::from_config("emacs"), KeybindingMode::Vim);
assert_eq!(KeybindingMode::from_config(""), KeybindingMode::Vim);
assert_eq!(KeybindingMode::from_config("VSCode"), KeybindingMode::Vim);
}
#[test]
fn default_is_vim() {
assert_eq!(KeybindingMode::default(), KeybindingMode::Vim);
}
#[cfg(feature = "serde")]
#[test]
fn serde_vim_round_trip() {
let json = serde_json::to_string(&KeybindingMode::Vim).unwrap();
assert_eq!(json, "\"vim\"");
let back: KeybindingMode = serde_json::from_str(&json).unwrap();
assert_eq!(back, KeybindingMode::Vim);
}
#[cfg(feature = "serde")]
#[test]
fn serde_vscode_round_trip() {
let json = serde_json::to_string(&KeybindingMode::Vscode).unwrap();
assert_eq!(json, "\"vscode\"");
let back: KeybindingMode = serde_json::from_str(&json).unwrap();
assert_eq!(back, KeybindingMode::Vscode);
}
}