@ -3662,6 +3662,7 @@ fn goto_first_diag(cx: &mut Context) {
Some ( diag ) = > Selection ::single ( diag . range . start , diag . range . end ) ,
Some ( diag ) = > Selection ::single ( diag . range . start , diag . range . end ) ,
None = > return ,
None = > return ,
} ;
} ;
doc . set_selection ( view . id , selection ) ;
doc . set_selection ( view . id , selection ) ;
view . diagnostics_handler
view . diagnostics_handler
. immediately_show_diagnostic ( doc , view . id ) ;
. immediately_show_diagnostic ( doc , view . id ) ;
@ -3673,6 +3674,7 @@ fn goto_last_diag(cx: &mut Context) {
Some ( diag ) = > Selection ::single ( diag . range . start , diag . range . end ) ,
Some ( diag ) = > Selection ::single ( diag . range . start , diag . range . end ) ,
None = > return ,
None = > return ,
} ;
} ;
doc . set_selection ( view . id , selection ) ;
doc . set_selection ( view . id , selection ) ;
view . diagnostics_handler
view . diagnostics_handler
. immediately_show_diagnostic ( doc , view . id ) ;
. immediately_show_diagnostic ( doc , view . id ) ;
@ -3731,6 +3733,7 @@ fn goto_prev_diag(cx: &mut Context) {
view . diagnostics_handler
view . diagnostics_handler
. immediately_show_diagnostic ( doc , view . id ) ;
. immediately_show_diagnostic ( doc , view . id ) ;
} ;
} ;
cx . editor . apply_motion ( motion )
cx . editor . apply_motion ( motion )
}
}
@ -5029,6 +5032,8 @@ fn reverse_selection_contents(cx: &mut Context) {
// tree sitter node selection
// tree sitter node selection
const EXPAND_KEY : & str = "expand" ;
fn expand_selection ( cx : & mut Context ) {
fn expand_selection ( cx : & mut Context ) {
let motion = | editor : & mut Editor | {
let motion = | editor : & mut Editor | {
let ( view , doc ) = current ! ( editor ) ;
let ( view , doc ) = current ! ( editor ) ;
@ -5036,42 +5041,52 @@ fn expand_selection(cx: &mut Context) {
if let Some ( syntax ) = doc . syntax ( ) {
if let Some ( syntax ) = doc . syntax ( ) {
let text = doc . text ( ) . slice ( .. ) ;
let text = doc . text ( ) . slice ( .. ) ;
let current_selection = doc . selection ( view . id ) ;
let current_selection = doc . selection ( view . id ) .clone ( ) ;
let selection = object ::expand_selection ( syntax , text , current_selection . clone ( ) ) ;
let selection = object ::expand_selection ( syntax , text , current_selection . clone ( ) ) ;
// check if selection is different from the last one
// check if selection is different from the last one
if * current_selection ! = selection {
if current_selection ! = selection {
// save current selection so it can be restored using shrink_selection
let prev_selections = doc
view . object_selections . push ( current_selection . clone ( ) ) ;
. view_data_mut ( view . id )
. object_selections
. entry ( EXPAND_KEY )
. or_default ( ) ;
doc . set_selection ( view . id , selection ) ;
// save current selection so it can be restored using shrink_selection
prev_selections . push ( current_selection ) ;
doc . set_selection_clear ( view . id , selection , false ) ;
}
}
}
}
} ;
} ;
cx . editor . apply_motion ( motion ) ;
cx . editor . apply_motion ( motion ) ;
}
}
fn shrink_selection ( cx : & mut Context ) {
fn shrink_selection ( cx : & mut Context ) {
let motion = | editor : & mut Editor | {
let motion = | editor : & mut Editor | {
let ( view , doc ) = current ! ( editor ) ;
let ( view , doc ) = current ! ( editor ) ;
let current_selection = doc . selection ( view . id ) ;
let current_selection = doc . selection ( view . id ) . clone ( ) ;
let prev_expansions = doc
. view_data_mut ( view . id )
. object_selections
. entry ( EXPAND_KEY )
. or_default ( ) ;
// try to restore previous selection
// try to restore previous selection
if let Some ( prev_selection ) = view . object_selections . pop ( ) {
if let Some ( prev_selection ) = prev_expansions . pop ( ) {
if current_selection . contains ( & prev_selection ) {
// allow shrinking the selection only if current selection contains the previous object selection
doc . set_selection ( view . id , prev_selection ) ;
doc . set_selection_clear ( view . id , prev_selection , false ) ;
return ;
return ;
} else {
// clear existing selection as they can't be shrunk to anyway
view . object_selections . clear ( ) ;
}
}
}
// if not previous selection, shrink to first child
// if not previous selection, shrink to first child
if let Some ( syntax ) = doc . syntax ( ) {
if let Some ( syntax ) = doc . syntax ( ) {
let text = doc . text ( ) . slice ( .. ) ;
let text = doc . text ( ) . slice ( .. ) ;
let selection = object ::shrink_selection ( syntax , text , current_selection .clone ( ) );
let selection = object ::shrink_selection ( syntax , text , current_selection );
doc . set_selection ( view . id , selection ) ;
doc . set_selection _clear ( view . id , selection , false ) ;
}
}
} ;
} ;
cx . editor . apply_motion ( motion ) ;
cx . editor . apply_motion ( motion ) ;
}
}
@ -5190,8 +5205,6 @@ fn match_brackets(cx: &mut Context) {
doc . set_selection ( view . id , selection ) ;
doc . set_selection ( view . id , selection ) ;
}
}
//
fn jump_forward ( cx : & mut Context ) {
fn jump_forward ( cx : & mut Context ) {
let count = cx . count ( ) ;
let count = cx . count ( ) ;
let config = cx . editor . config ( ) ;
let config = cx . editor . config ( ) ;