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

Reply via email to