@ -3471,6 +3471,8 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
let text = doc . text ( ) ;
let text = doc . text ( ) ;
let selection = doc . selection ( view . id ) ;
let selection = doc . selection ( view . id ) ;
let mut ranges = SmallVec ::with_capacity ( selection . len ( ) ) ;
let transaction = Transaction ::change_by_selection ( text , selection , | range | {
let transaction = Transaction ::change_by_selection ( text , selection , | range | {
let pos = match ( action , linewise ) {
let pos = match ( action , linewise ) {
// paste linewise before
// paste linewise before
@ -3487,8 +3489,21 @@ fn paste_impl(values: &[String], doc: &mut Document, view: &mut View, action: Pa
// paste at cursor
// paste at cursor
( Paste ::Cursor , _ ) = > range . cursor ( text . slice ( .. ) ) ,
( Paste ::Cursor , _ ) = > range . cursor ( text . slice ( .. ) ) ,
} ;
} ;
( pos , pos , values . next ( ) )
let value = values . next ( ) ;
let value_len = value
. as_ref ( )
. map ( | content | content . chars ( ) . count ( ) )
. unwrap_or_default ( ) ;
ranges . push ( Range ::new ( pos , pos + value_len ) ) ;
( pos , pos , value )
} ) ;
} ) ;
let transaction = transaction . with_selection ( Selection ::new ( ranges , selection . primary_index ( ) ) ) ;
apply_transaction ( & transaction , doc , view ) ;
apply_transaction ( & transaction , doc , view ) ;
}
}
@ -4742,6 +4757,7 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {
let selection = doc . selection ( view . id ) ;
let selection = doc . selection ( view . id ) ;
let mut changes = Vec ::with_capacity ( selection . len ( ) ) ;
let mut changes = Vec ::with_capacity ( selection . len ( ) ) ;
let mut ranges = SmallVec ::with_capacity ( selection . len ( ) ) ;
let text = doc . text ( ) . slice ( .. ) ;
let text = doc . text ( ) . slice ( .. ) ;
for range in selection . ranges ( ) {
for range in selection . ranges ( ) {
@ -4765,11 +4781,13 @@ fn shell(cx: &mut compositor::Context, cmd: &str, behavior: &ShellBehavior) {
ShellBehavior ::Append = > ( range . to ( ) , range . to ( ) ) ,
ShellBehavior ::Append = > ( range . to ( ) , range . to ( ) ) ,
_ = > ( range . from ( ) , range . from ( ) ) ,
_ = > ( range . from ( ) , range . from ( ) ) ,
} ;
} ;
ranges . push ( Range ::new ( to , to + output . chars ( ) . count ( ) ) ) ;
changes . push ( ( from , to , Some ( output ) ) ) ;
changes . push ( ( from , to , Some ( output ) ) ) ;
}
}
if behavior ! = & ShellBehavior ::Ignore {
if behavior ! = & ShellBehavior ::Ignore {
let transaction = Transaction ::change ( doc . text ( ) , changes . into_iter ( ) ) ;
let transaction = Transaction ::change ( doc . text ( ) , changes . into_iter ( ) )
. with_selection ( Selection ::new ( ranges , selection . primary_index ( ) ) ) ;
apply_transaction ( & transaction , doc , view ) ;
apply_transaction ( & transaction , doc , view ) ;
doc . append_changes_to_history ( view . id ) ;
doc . append_changes_to_history ( view . id ) ;
}
}