aboutsummaryrefslogtreecommitdiff
path: root/helix-view/src
diff options
context:
space:
mode:
authorBenoît CORTIER2021-06-05 02:21:31 +0000
committerBlaž Hrastnik2021-06-07 12:52:09 +0000
commit68affa3c598723a8b9451ef3dcceda83ae161e39 (patch)
tree06a6c0ed9f6e0483b138b44d969f4341206cf4c0 /helix-view/src
parentd5de9183ef8392168b06131278554e483eddfff3 (diff)
Implement register selection
User can select register to yank into with the " command. A new state is added to `Editor` and `commands::Context` structs. This state is managed by leveraging a new struct `RegisterSelection`.
Diffstat (limited to 'helix-view/src')
-rw-r--r--helix-view/src/editor.rs4
-rw-r--r--helix-view/src/lib.rs2
-rw-r--r--helix-view/src/register_selection.rs47
3 files changed, 52 insertions, 1 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index fa8dea2f..b69ae22f 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -1,4 +1,4 @@
-use crate::{theme::Theme, tree::Tree, Document, DocumentId, View, ViewId};
+use crate::{theme::Theme, tree::Tree, Document, DocumentId, RegisterSelection, View, ViewId};
use tui::layout::Rect;
use std::path::PathBuf;
@@ -13,6 +13,7 @@ pub struct Editor {
pub tree: Tree,
pub documents: SlotMap<DocumentId, Document>,
pub count: Option<usize>,
+ pub register: RegisterSelection,
pub theme: Theme,
pub language_servers: helix_lsp::Registry,
@@ -57,6 +58,7 @@ impl Editor {
tree: Tree::new(area),
documents: SlotMap::with_key(),
count: None,
+ register: RegisterSelection::default(),
theme,
language_servers,
status_msg: None,
diff --git a/helix-view/src/lib.rs b/helix-view/src/lib.rs
index 00bddad6..7e253320 100644
--- a/helix-view/src/lib.rs
+++ b/helix-view/src/lib.rs
@@ -1,5 +1,6 @@
pub mod document;
pub mod editor;
+pub mod register_selection;
pub mod theme;
pub mod tree;
pub mod view;
@@ -10,5 +11,6 @@ new_key_type! { pub struct ViewId; }
pub use document::Document;
pub use editor::Editor;
+pub use register_selection::RegisterSelection;
pub use theme::Theme;
pub use view::View;
diff --git a/helix-view/src/register_selection.rs b/helix-view/src/register_selection.rs
new file mode 100644
index 00000000..d7f073b6
--- /dev/null
+++ b/helix-view/src/register_selection.rs
@@ -0,0 +1,47 @@
+/// Register selection and configuration
+///
+/// This is a kind a of specialized `Option<char>` for register selection.
+/// Point is to keep whether the register selection has been explicitely
+/// set or not while being convenient by knowing the default register name.
+pub struct RegisterSelection {
+ selected: char,
+ default_name: char,
+}
+
+impl RegisterSelection {
+ pub fn new(default_name: char) -> Self {
+ Self {
+ selected: default_name,
+ default_name,
+ }
+ }
+
+ pub fn select(&mut self, name: char) {
+ self.selected = name;
+ }
+
+ pub fn take(&mut self) -> Self {
+ Self {
+ selected: std::mem::replace(&mut self.selected, self.default_name),
+ default_name: self.default_name,
+ }
+ }
+
+ pub fn is_default(&self) -> bool {
+ self.selected == self.default_name
+ }
+
+ pub fn name(&self) -> char {
+ self.selected
+ }
+}
+
+impl Default for RegisterSelection {
+ fn default() -> Self {
+ let default_name = '"';
+ Self {
+ selected: default_name,
+ default_name,
+ }
+ }
+}