on master help sign in
Auto pair-removal (#2940)
52bb110Houkime
helix-term/src/commands.rs+33−7
@@ -3056,14 +3056,18 @@ pub mod insert {
3056
3056
3057 pub fn delete_char_backward(cx: &mut Context) {
3057 pub fn delete_char_backward(cx: &mut Context) {
3058 let count = cx.count();
3058 let count = cx.count();
3059− let (view, doc) = current!(cx.editor);
3059+ let (view, doc) = current_ref!(cx.editor);
3060 let text = doc.text().slice(..);
3060 let text = doc.text().slice(..);
3061 let indent_unit = doc.indent_unit();
3061 let indent_unit = doc.indent_unit();
3062 let tab_size = doc.tab_width();
3062 let tab_size = doc.tab_width();
3063+ let auto_pairs = doc.auto_pairs(cx.editor);
3063
3064
3064 let transaction =
3065 let transaction =
3065 Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
3066 Transaction::change_by_selection(doc.text(), doc.selection(view.id), |range| {
3066 let pos = range.cursor(text);
3067 let pos = range.cursor(text);
3068+ if pos == 0 {
3069+ return (pos, pos, None);
3070+ }
3067 let line_start_pos = text.line_to_char(range.cursor_line(text));
3071 let line_start_pos = text.line_to_char(range.cursor_line(text));
3068 // consider to delete by indent level if all characters before `pos` are indent units.
3072 // consider to delete by indent level if all characters before `pos` are indent units.
3069 let fragment = Cow::from(text.slice(line_start_pos..pos));
3073 let fragment = Cow::from(text.slice(line_start_pos..pos));
@@ -3111,14 +3115,36 @@ pub mod insert {
3111 (start, pos, None) // delete!
3115 (start, pos, None) // delete!
3112 }
3116 }
3113 } else {
3117 } else {
3114− // delete char
3118+ match (
3119+ text.get_char(pos.saturating_sub(1)),
3120+ text.get_char(pos),
3121+ auto_pairs,
3122+ ) {
3123+ (Some(_x), Some(_y), Some(ap))
3124+ if range.is_single_grapheme(text)
3125+ && ap.get(_x).is_some()
3126+ && ap.get(_x).unwrap().close == _y =>
3127+ // delete both autopaired characters
3128+ {
3129+ (
3130+ graphemes::nth_prev_grapheme_boundary(text, pos, count),
3131+ graphemes::nth_next_grapheme_boundary(text, pos, count),
3132+ None,
3133+ )
3134+ }
3135+ _ =>
3136+ // delete 1 char
3137+ {
3115− (
3138+ (
3116− graphemes::nth_prev_grapheme_boundary(text, pos, count),
3139+ graphemes::nth_prev_grapheme_boundary(text, pos, count),
3117− pos,
3140+ pos,
3118− None,
3141+ None,
3119− )
3142+ )
3143+ }
3144+ }
3120 }
3145 }
3121 });
3146 });
3147+ let (view, doc) = current!(cx.editor);
3122 doc.apply(&transaction, view.id);
3148 doc.apply(&transaction, view.id);
3123
3149
3124 lsp::signature_help_impl(cx, SignatureHelpInvoked::Automatic);
3150 lsp::signature_help_impl(cx, SignatureHelpInvoked::Automatic);