Christian Brabandt wrote:

> On Sa, 08 Dez 2012, Christian Brabandt wrote:
> 
> > > Given a file with the following lines (cursor position at '|')
> > > 
> > > First line
> > >   Second line beginning |with whitespace
> > > Third line
> > > 
> > > the following commands produce the indicated results:
> > > 1) _  goes to first non-blank character in the same line ('S')
> > > 2) v_   visually select region between 'S' and cursor position
> > > 3) d_  deletes the *whole* second line (even characters after the current 
> > > cursor position)
> > > 
> > > 1 and 2 work as I'd expect. I don't understand the behaviour of d_ though.
> > > According to :he d
> > > 
> > > "An exception for the d{motion} command: If the motion is not linewise, 
> > > the
> > > start and end of the motion are not in the same line, and there are only
> > > blanks before the start and after the end of the motion, the delete 
> > > becomes
> > > linewise.  This means that the delete also removes the line of blanks 
> > > that you
> > > might expect to remain."
> > > 
> > > However this doesn't cover my example since the condition 'start and end 
> > > of the motion are not in the same line' doesn't apply. I wasn't able to 
> > > find another documented exception.
> > > 
> > > Is this a bug or am I missing something?
> > 
> > _ is a linewise motion, so you are deleting the complete line.
> > You should however be able to use the o_v operator to force the motion 
> > to be characterwise, however, for some reason, this does not seem to 
> > work with d
> 
> Bram,
> strangely enough, dv_ only works when 'startofline' is set, but 
> does not, when 'sol' is unset.
> 
> This patch fixes it, by making sure, if motion_type_force is set to 'v' 
> or Ctrl_V 'startofline' option does not apply (as stated by :h 'sol')
> 
> (motion_type hasn't been set to MCHAR yet).
> 
> diff --git a/src/normal.c b/src/normal.c
> --- a/src/normal.c
> +++ b/src/normal.c
> @@ -8628,7 +8628,9 @@
>      cap->oap->motion_type = MLINE;
>      if (cursor_down(cap->count1 - 1L, cap->oap->op_type == OP_NOP) == FAIL)
>         clearopbeep(cap->oap);
> -    else if (  cap->oap->op_type == OP_DELETE
> +    else if (  ( cap->oap->op_type == OP_DELETE /* only with linwise motions 
> */
> +               && cap->oap->motion_force != 'v'
> +               && cap->oap->motion_force != Ctrl_V)
>             || cap->oap->op_type == OP_LSHIFT
>             || cap->oap->op_type == OP_RSHIFT)
>         beginline(BL_SOL | BL_FIX);

Thanks.  It's probably not difficult to add a test for this...

-- 
hundred-and-one symptoms of being an internet addict:
124. You begin conversations with, "Who is your internet service provider?"

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Reply via email to