diff options
Diffstat (limited to 'src/ops.c')
-rw-r--r-- | src/ops.c | 22 |
1 files changed, 20 insertions, 2 deletions
@@ -3333,14 +3333,32 @@ op_colon(oparg_T *oap) stuffcharReadbuff('.'); else stuffnumReadbuff((long)oap->start.lnum); - if (oap->end.lnum != oap->start.lnum) + +#ifdef FEAT_FOLDING + // When using !! on a closed fold the range ".!" works best to operate + // on, it will be made the whole closed fold later. + linenr_T endOfStartFold = oap->start.lnum; + (void)hasFolding(oap->start.lnum, NULL, &endOfStartFold); +#endif + if (oap->end.lnum != oap->start.lnum +#ifdef FEAT_FOLDING + && oap->end.lnum != endOfStartFold +#endif + ) { + // Make it a range with the end line. stuffcharReadbuff(','); if (oap->end.lnum == curwin->w_cursor.lnum) stuffcharReadbuff('.'); else if (oap->end.lnum == curbuf->b_ml.ml_line_count) stuffcharReadbuff('$'); - else if (oap->start.lnum == curwin->w_cursor.lnum) + else if (oap->start.lnum == curwin->w_cursor.lnum +#ifdef FEAT_FOLDING + // do not use ".+number" for a closed fold, it would count + // folded lines twice + && !hasFolding(oap->end.lnum, NULL, NULL) +#endif + ) { stuffReadbuff((char_u *)".+"); stuffnumReadbuff((long)oap->line_count - 1); |