diff options
author | Gokul Soumya | 2021-12-18 02:55:40 +0000 |
---|---|---|
committer | Gokul Soumya | 2021-12-18 02:56:11 +0000 |
commit | 016640f4fb6f620df13a2cab15e749d623197a51 (patch) | |
tree | 214281b9dc0843ac455bc20a636169858cce2ca2 /helix-view/src | |
parent | 058796c18e786309322731ff68b15a0f3901b60b (diff) |
Remove ui.cursor.primary and hashmap lookups
Diffstat (limited to 'helix-view/src')
-rw-r--r-- | helix-view/src/document.rs | 6 | ||||
-rw-r--r-- | helix-view/src/editor.rs | 36 |
2 files changed, 27 insertions, 15 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 76b19a07..01975452 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -29,9 +29,9 @@ pub const SCRATCH_BUFFER_NAME: &str = "[scratch]"; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum Mode { - Normal, - Select, - Insert, + Normal = 0, + Select = 1, + Insert = 2, } impl Display for Mode { diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index b558c183..a121a836 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -22,10 +22,10 @@ use anyhow::Error; pub use helix_core::diagnostic::Severity; pub use helix_core::register::Registers; -use helix_core::{hashmap, syntax}; +use helix_core::syntax; use helix_core::{Position, Selection}; -use serde::Deserialize; +use serde::{Deserialize, Deserializer}; fn deserialize_duration_millis<'de, D>(deserializer: D) -> Result<Duration, D::Error> where @@ -107,12 +107,28 @@ pub struct Config { pub cursor_shape: CursorShapeConfig, } -#[derive(Debug, Clone, PartialEq, Deserialize)] -#[serde(transparent)] -pub struct CursorShapeConfig(HashMap<Mode, CursorKind>); +// Cursor shape is read and used on every rendered frame and so needs +// to be fast. Therefore we avoid a hashmap and use an enum indexed array. +#[derive(Debug, Clone, PartialEq)] +pub struct CursorShapeConfig([CursorKind; 3]); + +impl<'de> Deserialize<'de> for CursorShapeConfig { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + let m = HashMap::<Mode, CursorKind>::deserialize(deserializer)?; + let into_cursor = |mode: Mode| m.get(&mode).copied().unwrap_or_default(); + Ok(CursorShapeConfig([ + into_cursor(Mode::Normal), + into_cursor(Mode::Select), + into_cursor(Mode::Insert), + ])) + } +} impl std::ops::Deref for CursorShapeConfig { - type Target = HashMap<Mode, CursorKind>; + type Target = [CursorKind; 3]; fn deref(&self) -> &Self::Target { &self.0 @@ -121,11 +137,7 @@ impl std::ops::Deref for CursorShapeConfig { impl Default for CursorShapeConfig { fn default() -> Self { - Self(hashmap!( - Mode::Insert => CursorKind::Block, - Mode::Normal => CursorKind::Block, - Mode::Select => CursorKind::Block, - )) + Self([CursorKind::Block; 3]) } } @@ -621,7 +633,7 @@ impl Editor { let cursorkind = self .config .cursor_shape - .get(&doc.mode()) + .get(doc.mode() as usize) .copied() .unwrap_or_default(); (Some(pos), cursorkind) |