Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show infobox to hint textobjects with mi and ma #1686

30 changes: 29 additions & 1 deletion helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5353,7 +5353,10 @@ fn select_textobject_inner(cx: &mut Context) {

fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
let count = cx.count();

cx.on_next_key(move |cx, event| {
cx.editor.autoinfo = None;
cx.editor.pseudo_pending = None;
if let Some(ch) = event.char() {
let textobject = move |editor: &mut Editor| {
let (view, doc) = current!(editor);
Expand Down Expand Up @@ -5402,7 +5405,32 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
textobject(cx.editor);
cx.editor.last_motion = Some(Motion(Box::new(textobject)));
}
})
});

if let Some((title, abbrev)) = match objtype {
textobject::TextObject::Inside => Some(("Match inside", "mi")),
textobject::TextObject::Around => Some(("Match around", "ma")),
_ => return,
} {
let help_text = [
("w", "Word"),
("W", "WORD"),
("c", "Class (tree-sitter)"),
("f", "Function (tree-sitter)"),
("p", "Parameter (tree-sitter)"),
("m", "Matching delimiter under cursor"),
(" ", "... or any character acting as a pair"),
];

cx.editor.autoinfo = Some(Info::new(
title,
help_text
.into_iter()
.map(|(col1, col2)| (col1.to_string(), col2.to_string()))
.collect(),
));
cx.editor.pseudo_pending = Some(abbrev.to_string());
};
}

fn surround_add(cx: &mut Context) {
Expand Down
3 changes: 3 additions & 0 deletions helix-term/src/ui/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1211,6 +1211,9 @@ impl Component for EditorView {
disp.push_str(&s);
}
}
if let Some(pseudo_pending) = &cx.editor.pseudo_pending {
disp.push_str(&*pseudo_pending)
archseer marked this conversation as resolved.
Show resolved Hide resolved
}
let style = cx.editor.theme.get("ui.text");
let macro_width = if cx.editor.macro_recording.is_some() {
3
Expand Down
2 changes: 2 additions & 0 deletions helix-view/src/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ pub struct Editor {

pub idle_timer: Pin<Box<Sleep>>,
pub last_motion: Option<Motion>,
pub pseudo_pending: Option<String>,

pub exit_code: i32,
}
Expand Down Expand Up @@ -346,6 +347,7 @@ impl Editor {
autoinfo: None,
idle_timer: Box::pin(sleep(config.idle_timeout)),
last_motion: None,
pseudo_pending: None,
config,
auto_pairs,
exit_code: 0,
Expand Down