move commands and keymap back to terminal.

Command needs to be able to deal with UI. We'll separate it again later
on.
pull/6/head
Blaž Hrastnik 4 years ago
parent be3c021046
commit 5103dc9617

1
Cargo.lock generated

@ -522,6 +522,7 @@ dependencies = [
"helix-view", "helix-view",
"log", "log",
"num_cpus", "num_cpus",
"once_cell",
"smol", "smol",
"tui", "tui",
] ]

@ -17,6 +17,7 @@ helix-view = { path = "../helix-view", features = ["term"]}
helix-lsp = { path = "../helix-lsp"} helix-lsp = { path = "../helix-lsp"}
anyhow = "1" anyhow = "1"
once_cell = "1.4"
smol = "1" smol = "1"
num_cpus = "1" num_cpus = "1"

@ -1,14 +1,14 @@
use clap::ArgMatches as Args; use crate::{
use helix_core::{indent::TAB_WIDTH, syntax::HighlightEvent, Position, Range, State};
use helix_view::{
commands, commands,
document::Mode,
keymap::{self, Keymaps}, keymap::{self, Keymaps},
prompt::Prompt,
Document, Editor, Theme, View,
}; };
use clap::ArgMatches as Args;
use helix_core::{indent::TAB_WIDTH, syntax::HighlightEvent, Position, Range, State};
use helix_view::{document::Mode, Document, Editor, Theme, View};
use crate::compositor::{Component, Compositor, EventResult}; use crate::compositor::{Component, Compositor, EventResult};
use crate::prompt::Prompt;
use log::{debug, info}; use log::{debug, info};
@ -395,23 +395,16 @@ impl Component for EditorView {
EventResult::Consumed(None) EventResult::Consumed(None)
} }
Event::Key(event) => { Event::Key(event) => {
// if there's a prompt, it takes priority if let Some(view) = self.editor.view_mut() {
if let Some(prompt) = &mut self.prompt {
self.prompt
.as_mut()
.unwrap()
.handle_input(event, &mut self.editor);
EventResult::Consumed(None)
} else if let Some(view) = self.editor.view_mut() {
let keys = vec![event]; let keys = vec![event];
// TODO: sequences (`gg`) // TODO: sequences (`gg`)
// TODO: handle count other than 1 // TODO: handle count other than 1
match view.doc.mode() { match view.doc.mode() {
Mode::Insert => { Mode::Insert => {
if let Some(command) = self.keymap[&Mode::Insert].get(&keys) { if let Some(command) = self.keymap[&Mode::Insert].get(&keys) {
let mut cx = helix_view::commands::Context { let mut cx = commands::Context {
view, view,
executor: executor, executor,
count: 1, count: 1,
}; };
@ -421,9 +414,9 @@ impl Component for EditorView {
.. ..
} = event } = event
{ {
let mut cx = helix_view::commands::Context { let mut cx = commands::Context {
view, view,
executor: executor, executor,
count: 1, count: 1,
}; };
commands::insert::insert_char(&mut cx, c); commands::insert::insert_char(&mut cx, c);
@ -488,9 +481,9 @@ impl Component for EditorView {
// HAXX: special casing for command mode // HAXX: special casing for command mode
} else if let Some(command) = self.keymap[&Mode::Normal].get(&keys) { } else if let Some(command) = self.keymap[&Mode::Normal].get(&keys) {
let mut cx = helix_view::commands::Context { let mut cx = commands::Context {
view, view,
executor: executor, executor,
count: 1, count: 1,
}; };
command(&mut cx); command(&mut cx);
@ -501,9 +494,9 @@ impl Component for EditorView {
} }
mode => { mode => {
if let Some(command) = self.keymap[&mode].get(&keys) { if let Some(command) = self.keymap[&mode].get(&keys) {
let mut cx = helix_view::commands::Context { let mut cx = commands::Context {
view, view,
executor: executor, executor,
count: 1, count: 1,
}; };
command(&mut cx); command(&mut cx);
@ -530,13 +523,6 @@ impl Component for EditorView {
let theme_ref = unsafe { &*(&self.editor.theme as *const Theme) }; let theme_ref = unsafe { &*(&self.editor.theme as *const Theme) };
if let Some(view) = self.editor.view_mut() { if let Some(view) = self.editor.view_mut() {
renderer.render_view(view, viewport, theme_ref); renderer.render_view(view, viewport, theme_ref);
if let Some(prompt) = &self.prompt {
if prompt.should_close {
self.prompt = None;
} else {
renderer.render_prompt(view, prompt, theme_ref);
}
}
} }
// TODO: drop unwrap // TODO: drop unwrap
@ -562,7 +548,6 @@ impl<'a> Application<'a> {
renderer, renderer,
// TODO; move to state // TODO; move to state
compositor, compositor,
prompt: None,
executor, executor,
language_server, language_server,

@ -6,11 +6,13 @@ use helix_core::{
state::{Direction, Granularity, State}, state::{Direction, Granularity, State},
ChangeSet, Range, Selection, Tendril, Transaction, ChangeSet, Range, Selection, Tendril, Transaction,
}; };
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use crate::{ use crate::prompt::Prompt;
use helix_view::{
document::Mode, document::Mode,
prompt::Prompt,
view::{View, PADDING}, view::{View, PADDING},
}; };

@ -20,6 +20,14 @@ use tui::buffer::Buffer as Surface;
pub(crate) type Callback = Box<dyn Fn(&mut Compositor)>; pub(crate) type Callback = Box<dyn Fn(&mut Compositor)>;
// --> EventResult should have a callback that takes a context with methods like .popup(),
// .prompt() etc. That way we can abstract it from the renderer.
// Q: How does this interact with popups where we need to be able to specify the rendering of the
// popup?
// A: It could just take a textarea.
//
// If Compositor was specified in the callback that's then problematic because of
// Cursive-inspired // Cursive-inspired
pub(crate) enum EventResult { pub(crate) enum EventResult {
Ignored, Ignored,

@ -1,6 +1,6 @@
use crate::commands::{self, Command}; use crate::commands::{self, Command};
use crate::document::Mode;
use helix_core::hashmap; use helix_core::hashmap;
use helix_view::document::Mode;
use std::collections::HashMap; use std::collections::HashMap;
// Kakoune-inspired: // Kakoune-inspired:
@ -87,7 +87,7 @@ use std::collections::HashMap;
// gr = goto reference // gr = goto reference
// } // }
#[cfg(feature = "term")] // #[cfg(feature = "term")]
pub use crossterm::event::{KeyCode, KeyEvent as Key, KeyModifiers as Modifiers}; pub use crossterm::event::{KeyCode, KeyEvent as Key, KeyModifiers as Modifiers};
// TODO: could be trie based // TODO: could be trie based

@ -1,7 +1,10 @@
#![allow(unused)] #![allow(unused)]
mod application; mod application;
mod commands;
mod compositor; mod compositor;
mod keymap;
mod prompt;
use application::Application; use application::Application;

@ -80,7 +80,7 @@ impl Prompt {
self.completion_selection_index = None; self.completion_selection_index = None;
} }
pub fn handle_input(&mut self, key_event: KeyEvent, editor: &mut Editor) { pub fn handle_event(&mut self, key_event: KeyEvent, editor: &mut Editor) {
match key_event { match key_event {
KeyEvent { KeyEvent {
code: KeyCode::Char(c), code: KeyCode::Char(c),

@ -1,8 +1,5 @@
pub mod commands;
pub mod document; pub mod document;
pub mod editor; pub mod editor;
pub mod keymap;
pub mod prompt;
pub mod theme; pub mod theme;
pub mod view; pub mod view;

Loading…
Cancel
Save