@@ -311,43 +311,63 @@ impl Term {
311
311
}
312
312
313
313
pub fn string_from_selection ( & self , span : & Span ) -> String {
314
- trait Append < T > {
315
- fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : T ) ;
314
+ /// Need a generic push() for the Append trait
315
+ trait PushChar {
316
+ fn push_char ( & mut self , c : char ) ;
317
+ fn maybe_newline ( & mut self , grid : & Grid < Cell > , line : Line , ending : Column ) {
318
+ if ending != Column ( 0 ) && !grid[ line] [ ending - 1 ] . flags . contains ( cell:: WRAPLINE ) {
319
+ self . push_char ( '\n' ) ;
320
+ }
321
+ }
322
+ }
323
+
324
+ impl PushChar for String {
325
+ #[ inline]
326
+ fn push_char ( & mut self , c : char ) {
327
+ self . push ( c) ;
328
+ }
329
+ }
330
+ trait Append < T > : PushChar {
331
+ fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : T ) -> Range < Column > ;
316
332
}
317
333
318
334
use std:: ops:: { Range , RangeTo , RangeFrom , RangeFull } ;
319
335
320
336
impl Append < Range < Column > > for String {
321
- fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : Range < Column > ) {
337
+ fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : Range < Column > ) -> Range < Column > {
322
338
let line = & grid[ line] ;
323
339
let line_length = line. line_length ( ) ;
324
340
let line_end = cmp:: min ( line_length, cols. end + 1 ) ;
325
341
for cell in & line[ cols. start ..line_end] {
326
342
self . push ( cell. c ) ;
327
343
}
344
+
345
+ cols. start ..line_end
328
346
}
329
347
}
330
348
331
349
impl Append < RangeTo < Column > > for String {
332
350
#[ inline]
333
- fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : RangeTo < Column > ) {
334
- self . append ( grid, line, Column ( 0 ) ..cols. end ) ;
351
+ fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : RangeTo < Column > ) -> Range < Column > {
352
+ self . append ( grid, line, Column ( 0 ) ..cols. end )
335
353
}
336
354
}
337
355
338
356
impl Append < RangeFrom < Column > > for String {
339
357
#[ inline]
340
- fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : RangeFrom < Column > ) {
341
- self . append ( grid, line, cols. start ..Column ( usize:: max_value ( ) - 1 ) ) ;
342
- self . push ( '\n' ) ;
358
+ fn append ( & mut self , grid : & Grid < Cell > , line : Line , cols : RangeFrom < Column > ) -> Range < Column > {
359
+ let range = self . append ( grid, line, cols. start ..Column ( usize:: max_value ( ) - 1 ) ) ;
360
+ self . maybe_newline ( grid, line, range. end ) ;
361
+ range
343
362
}
344
363
}
345
364
346
365
impl Append < RangeFull > for String {
347
366
#[ inline]
348
- fn append ( & mut self , grid : & Grid < Cell > , line : Line , _: RangeFull ) {
349
- self . append ( grid, line, Column ( 0 ) ..Column ( usize:: max_value ( ) - 1 ) ) ;
350
- self . push ( '\n' ) ;
367
+ fn append ( & mut self , grid : & Grid < Cell > , line : Line , _: RangeFull ) -> Range < Column > {
368
+ let range = self . append ( grid, line, Column ( 0 ) ..Column ( usize:: max_value ( ) - 1 ) ) ;
369
+ self . maybe_newline ( grid, line, range. end ) ;
370
+ range
351
371
}
352
372
}
353
373
@@ -564,6 +584,15 @@ impl ansi::Handler for Term {
564
584
fn input ( & mut self , c : char ) {
565
585
if self . cursor . col == self . grid . num_cols ( ) {
566
586
debug_println ! ( "wrapping" ) ;
587
+ {
588
+ let location = Cursor {
589
+ line : self . cursor . line ,
590
+ col : self . cursor . col - 1
591
+ } ;
592
+
593
+ let cell = & mut self . grid [ & location] ;
594
+ cell. flags . insert ( cell:: WRAPLINE ) ;
595
+ }
567
596
if ( self . cursor . line + 1 ) >= self . scroll_region . end {
568
597
self . linefeed ( ) ;
569
598
} else {
0 commit comments