diff options
Diffstat (limited to 'helix-term/src/commands.rs')
-rw-r--r-- | helix-term/src/commands.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index cac86adb..87f1c178 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -494,6 +494,7 @@ impl MappableCommand { command_palette, "Open command palette", open_or_focus_explorer, "Open or focus explorer", reveal_current_file, "Reveal current file in explorer", + insert_digraph, "Insert Unicode characters with prompt", ); } @@ -6020,3 +6021,50 @@ fn replay_macro(cx: &mut Context) { cx.editor.macro_replaying.pop(); })); } + +fn insert_digraph(cx: &mut Context) { + ui::prompt( + cx, + "digraph:".into(), + Some('K'), // todo: decide on register to use + move |editor, input| { + editor + .config() + .digraphs + .search(input) + .take(10) + .map(|entry| { + // todo: Prompt does not currently allow additional text as part + // of it's suggestions. Show the user the symbol and description + // once prompt has been made more robust + #[allow(clippy::useless_format)] + ((0..), Cow::from(format!("{}", entry.sequence))) + }) + .collect() + }, + move |cx, input, event| { + match event { + PromptEvent::Validate => (), + _ => return, + } + let config = cx.editor.config(); + let symbols = if let Some(entry) = config.digraphs.get(input) { + &entry.symbols + } else { + cx.editor.set_error("Digraph not found"); + return; + }; + + let (view, doc) = current!(cx.editor); + let selection = doc.selection(view.id); + let mut changes = Vec::with_capacity(selection.len()); + + for range in selection.ranges() { + changes.push((range.from(), range.from(), Some(symbols.clone().into()))); + } + let trans = Transaction::change(doc.text(), changes.into_iter()); + doc.apply(&trans, view.id); + doc.append_changes_to_history(view); + }, + ) +} |