Saturday, December 8, 2012

Re: behaviour of d_

Hi

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);


regards,
Christian
--
Jeder Mensch hat ein Brett vor dem Kopf, es kommt nur auf die Entfernung an.

--
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: