@@ -225,7 +225,6 @@ impl Renderer {
225225 Mode::Insert => "INS",
226226 Mode::Normal => "NOR",
227227 Mode::Goto => "GOTO",
228− Mode::Command => "COM", // command?
229228 };
230229 // statusline
231230 self.surface.set_style(
@@ -237,13 +236,15 @@ impl Renderer {
237236 }
238237
239238 pub fn render_prompt(&mut self, prompt: &Prompt) {
240− use tui::backend::Backend;
241239 // render buffer text
242240 self.surface
243− .set_string(1, self.size.1 - 1, String::from(":"), self.text_color);
241+ .set_string(1, self.size.1 - 1, &prompt.prompt, self.text_color);
244242 self.surface
245− .set_string(2, self.size.1 - 1, &prompt.buffer, self.text_color);
243+ .set_string(2, self.size.1 - 1, &prompt.line, self.text_color);
244+ }
246245
246+ pub fn draw(&mut self) {
247+ use tui::backend::Backend;
247248 // TODO: theres probably a better place for this
248249 self.terminal
249250 .backend_mut()
@@ -259,7 +260,7 @@ impl Renderer {
259260 mode => write!(stdout, "\x1B[2 q"),
260261 };
261262 let pos = if let Some(prompt) = prompt {
262− Position::new(self.size.0 as usize, 2 + prompt.cursor_loc)
263+ Position::new(self.size.0 as usize, 2 + prompt.cursor)
263264 } else {
264265 if let Some(path) = view.state.path() {
265266 self.surface.set_string(
@@ -303,15 +304,6 @@ impl Application {
303304 Ok(app)
304305 }
305306
306− pub fn set_prompt(&mut self) {
307− let commands = |editor: &mut Editor, input: &str| match input {
308− "q" => editor.should_close = true,
309− _ => (),
310− };
311− let prompt = Prompt::new(|input| None, commands);
312− self.prompt = Some(prompt);
313− }
314−
315307 fn render(&mut self) {
316308 let viewport = Rect::new(OFFSET, 0, self.terminal.size.0, self.terminal.size.1 - 2); // - 2 for statusline and prompt
317309
@@ -323,6 +315,8 @@ impl Application {
323315 self.terminal.render_prompt(prompt);
324316 }
325317
318+ self.terminal.draw();
319+
326320 // TODO: drop unwrap
327321 self.terminal.render_cursor(
328322 self.editor.view.as_ref().unwrap(),
@@ -335,7 +329,6 @@ impl Application {
335329 let mut reader = EventStream::new();
336330 let keymap = keymap::default();
337331
338− self.set_prompt();
339332 self.render();
340333
341334 loop {
@@ -363,6 +356,8 @@ impl Application {
363356 .as_mut()
364357 .unwrap()
365358 .handle_input(event, &mut self.editor);
359+
360+ self.render();
366361 } else if let Some(view) = &mut self.editor.view {
367362 let keys = vec![event];
368363 // TODO: sequences (`gg`)
@@ -380,7 +375,31 @@ impl Application {
380375 }
381376 view.ensure_cursor_in_view();
382377 }
383− Mode::Command => unreachable!(),
378+ Mode::Normal => {
379+ if let &[KeyEvent {
380+ code: KeyCode::Char(':'),
381+ ..
382+ }] = keys.as_slice()
383+ {
384+ let prompt = Prompt::new(
385+ ":".to_owned(),
386+ |_input: &str| None, // completion
387+ |editor: &mut Editor, input: &str| match input {
388+ "q" => editor.should_close = true,
389+ _ => (),
390+ },
391+ );
392+
393+ self.prompt = Some(prompt);
394+
395+ // HAXX: special casing for command mode
396+ } else if let Some(command) = keymap[&Mode::Normal].get(&keys) {
397+ command(view, 1);
398+
399+ // TODO: simplistic ensure cursor in view for now
400+ view.ensure_cursor_in_view();
401+ }
402+ }
384403 mode => {
385404 if let Some(command) = keymap[&mode].get(&keys) {
386405 command(view, 1);