@@ -83,10 +83,11 @@ impl Prompt {
86− pub fn with_line(mut self, line: String) -> Self {
86+ pub fn with_line(mut self, line: String, editor: &Editor) -> Self {
87 let cursor = line.len();
87 let cursor = line.len();
88 self.line = line;
88 self.line = line;
89 self.cursor = cursor;
89 self.cursor = cursor;
90+ self.recalculate_completion(editor);
@@ -95,6 +96,7 @@ impl Prompt {
97 pub fn recalculate_completion(&mut self, editor: &Editor) {
98 pub fn recalculate_completion(&mut self, editor: &Editor) {
99+ self.exit_selection();
98 self.completion = (self.completion_fn)(editor, &self.line);
100 self.completion = (self.completion_fn)(editor, &self.line);
@@ -213,12 +215,12 @@ impl Prompt {
213 self.cursor = pos;
215 self.cursor = pos;
215 self.recalculate_completion(cx.editor);
217 self.recalculate_completion(cx.editor);
216− self.exit_selection();
219− pub fn insert_str(&mut self, s: &str) {
220+ pub fn insert_str(&mut self, s: &str, editor: &Editor) {
220 self.line.insert_str(self.cursor, s);
221 self.line.insert_str(self.cursor, s);
221 self.cursor += s.len();
222 self.cursor += s.len();
223+ self.recalculate_completion(editor);
224 pub fn move_cursor(&mut self, movement: Movement) {
226 pub fn move_cursor(&mut self, movement: Movement) {
@@ -234,65 +236,65 @@ impl Prompt {
234 self.cursor = self.line.len();
236 self.cursor = self.line.len();
237− pub fn delete_char_backwards(&mut self, cx: &Context) {
239+ pub fn delete_char_backwards(&mut self, editor: &Editor) {
238 let pos = self.eval_movement(Movement::BackwardChar(1));
240 let pos = self.eval_movement(Movement::BackwardChar(1));
239 self.line.replace_range(pos..self.cursor, "");
241 self.line.replace_range(pos..self.cursor, "");
240 self.cursor = pos;
242 self.cursor = pos;
242− self.exit_selection();
243− self.recalculate_completion(cx.editor);
244+ self.recalculate_completion(editor);
246− pub fn delete_char_forwards(&mut self, cx: &Context) {
247+ pub fn delete_char_forwards(&mut self, editor: &Editor) {
247 let pos = self.eval_movement(Movement::ForwardChar(1));
248 let pos = self.eval_movement(Movement::ForwardChar(1));
248 self.line.replace_range(self.cursor..pos, "");
249 self.line.replace_range(self.cursor..pos, "");
250− self.exit_selection();
251− self.recalculate_completion(cx.editor);
251+ self.recalculate_completion(editor);
254− pub fn delete_word_backwards(&mut self, cx: &Context) {
254+ pub fn delete_word_backwards(&mut self, editor: &Editor) {
255 let pos = self.eval_movement(Movement::BackwardWord(1));
255 let pos = self.eval_movement(Movement::BackwardWord(1));
256 self.line.replace_range(pos..self.cursor, "");
256 self.line.replace_range(pos..self.cursor, "");
257 self.cursor = pos;
257 self.cursor = pos;
259− self.exit_selection();
260− self.recalculate_completion(cx.editor);
259+ self.recalculate_completion(editor);
263− pub fn delete_word_forwards(&mut self, cx: &Context) {
262+ pub fn delete_word_forwards(&mut self, editor: &Editor) {
264 let pos = self.eval_movement(Movement::ForwardWord(1));
263 let pos = self.eval_movement(Movement::ForwardWord(1));
265 self.line.replace_range(self.cursor..pos, "");
264 self.line.replace_range(self.cursor..pos, "");
267− self.exit_selection();
268− self.recalculate_completion(cx.editor);
266+ self.recalculate_completion(editor);
271− pub fn kill_to_start_of_line(&mut self, cx: &Context) {
269+ pub fn kill_to_start_of_line(&mut self, editor: &Editor) {
272 let pos = self.eval_movement(Movement::StartOfLine);
270 let pos = self.eval_movement(Movement::StartOfLine);
273 self.line.replace_range(pos..self.cursor, "");
271 self.line.replace_range(pos..self.cursor, "");
274 self.cursor = pos;
272 self.cursor = pos;
276− self.exit_selection();
277− self.recalculate_completion(cx.editor);
274+ self.recalculate_completion(editor);
280− pub fn kill_to_end_of_line(&mut self, cx: &Context) {
277+ pub fn kill_to_end_of_line(&mut self, editor: &Editor) {
281 let pos = self.eval_movement(Movement::EndOfLine);
278 let pos = self.eval_movement(Movement::EndOfLine);
282 self.line.replace_range(self.cursor..pos, "");
279 self.line.replace_range(self.cursor..pos, "");
284− self.exit_selection();
285− self.recalculate_completion(cx.editor);
281+ self.recalculate_completion(editor);
288− pub fn clear(&mut self, cx: &Context) {
284+ pub fn clear(&mut self, editor: &Editor) {
289 self.line.clear();
285 self.line.clear();
290 self.cursor = 0;
286 self.cursor = 0;
291− self.recalculate_completion(cx.editor);
287+ self.recalculate_completion(editor);
292− self.exit_selection();
290+ pub fn change_history(
295− pub fn change_history(&mut self, register: &[String], direction: CompletionDirection) {
294+ direction: CompletionDirection,
296+ let register = cx.editor.registers.get_mut(register).read();
296 if register.is_empty() {
298 if register.is_empty() {
@@ -312,6 +314,7 @@ impl Prompt {
312 self.history_pos = Some(index);
314 self.history_pos = Some(index);
314 self.move_end();
316 self.move_end();
317+ self.recalculate_completion(cx.editor);
317 pub fn change_completion_selection(&mut self, direction: CompletionDirection) {
320 pub fn change_completion_selection(&mut self, direction: CompletionDirection) {
@@ -494,16 +497,18 @@ impl Component for Prompt {
494 ctrl!('f') | key!(Right) => self.move_cursor(Movement::ForwardChar(1)),
497 ctrl!('f') | key!(Right) => self.move_cursor(Movement::ForwardChar(1)),
495 ctrl!('e') | key!(End) => self.move_end(),
498 ctrl!('e') | key!(End) => self.move_end(),
496 ctrl!('a') | key!(Home) => self.move_start(),
499 ctrl!('a') | key!(Home) => self.move_start(),
497− ctrl!('w') | alt!(Backspace) | ctrl!(Backspace) => self.delete_word_backwards(cx),
500+ ctrl!('w') | alt!(Backspace) | ctrl!(Backspace) => {
501+ self.delete_word_backwards(cx.editor)
498− alt!('d') | alt!(Delete) | ctrl!(Delete) => self.delete_word_forwards(cx),
503+ alt!('d') | alt!(Delete) | ctrl!(Delete) => self.delete_word_forwards(cx.editor),
499− ctrl!('k') => self.kill_to_end_of_line(cx),
504+ ctrl!('k') => self.kill_to_end_of_line(cx.editor),
500− ctrl!('u') => self.kill_to_start_of_line(cx),
505+ ctrl!('u') => self.kill_to_start_of_line(cx.editor),
501 ctrl!('h') | key!(Backspace) => {
506 ctrl!('h') | key!(Backspace) => {
502− self.delete_char_backwards(cx);
507+ self.delete_char_backwards(cx.editor);
503 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
508 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
505 ctrl!('d') | key!(Delete) => {
510 ctrl!('d') | key!(Delete) => {
506− self.delete_char_forwards(cx);
511+ self.delete_char_forwards(cx.editor);
507 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
512 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
509 ctrl!('s') => {
514 ctrl!('s') => {
@@ -520,14 +525,13 @@ impl Component for Prompt {
521 let line = text.slice(range.from()..range.to()).to_string();
526 let line = text.slice(range.from()..range.to()).to_string();
522 if !line.is_empty() {
527 if !line.is_empty() {
523− self.insert_str(line.as_str());
528+ self.insert_str(line.as_str(), cx.editor);
524 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
529 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
527 key!(Enter) => {
532 key!(Enter) => {
528 if self.selection.is_some() && self.line.ends_with(std::path::MAIN_SEPARATOR) {
533 if self.selection.is_some() && self.line.ends_with(std::path::MAIN_SEPARATOR) {
529 self.recalculate_completion(cx.editor);
534 self.recalculate_completion(cx.editor);
530− self.exit_selection();
532 // handle executing with last command in history if nothing entered
536 // handle executing with last command in history if nothing entered
533 let input: Cow<str> = if self.line.is_empty() {
537 let input: Cow<str> = if self.line.is_empty() {
@@ -553,15 +557,13 @@ impl Component for Prompt {
554 ctrl!('p') | key!(Up) => {
558 ctrl!('p') | key!(Up) => {
555 if let Some(register) = self.history_register {
559 if let Some(register) = self.history_register {
556− let register = cx.editor.registers.get_mut(register);
557− self.change_history(register.read(), CompletionDirection::Backward);
560+ self.change_history(cx, register, CompletionDirection::Backward);
558 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
561 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
561 ctrl!('n') | key!(Down) => {
564 ctrl!('n') | key!(Down) => {
562 if let Some(register) = self.history_register {
565 if let Some(register) = self.history_register {
563− let register = cx.editor.registers.get_mut(register);
564− self.change_history(register.read(), CompletionDirection::Forward);
566+ self.change_history(cx, register, CompletionDirection::Forward);
565 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
567 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
@@ -570,7 +572,6 @@ impl Component for Prompt {
570 // if single completion candidate is a directory list content in completion
572 // if single completion candidate is a directory list content in completion
571 if self.completion.len() == 1 && self.line.ends_with(std::path::MAIN_SEPARATOR) {
573 if self.completion.len() == 1 && self.line.ends_with(std::path::MAIN_SEPARATOR) {
572 self.recalculate_completion(cx.editor);
574 self.recalculate_completion(cx.editor);
573− self.exit_selection();
575 (self.callback_fn)(cx, &self.line, PromptEvent::Update)
576 (self.callback_fn)(cx, &self.line, PromptEvent::Update)
@@ -602,8 +603,8 @@ impl Component for Prompt {
603 .and_then(|r| r.first())
604 .and_then(|r| r.first())
604 .map_or("", |r| r.as_str()),
605 .map_or("", |r| r.as_str()),
606− prompt.recalculate_completion(context.editor);
608 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
609 (self.callback_fn)(cx, &self.line, PromptEvent::Update);
609 return EventResult::Consumed(None);
610 return EventResult::Consumed(None);