Saturday, December 8, 2012

Re: behaviour of d_

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 -- Bram@Moolenaar.net -- 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

No comments:

Post a Comment