:normal stops execution when cursor can't be moved

24 views
Skip to first unread message

Mohammed Chelouti

unread,
Jan 3, 2013, 10:58:15 PM1/3/13
to vim...@googlegroups.com
Hello

I have found an unexpected behaviour in the normal command and I am not sure
if it is a bug or just not explicitly mentioned in the help.

Consider the following file (# depicts the cursor):

1 foo
2 #bar
3 zab

Now enter :norm! ddkP, the file should now look like this.

1 #bar
2 foo
3 zab

So far so good, execute the same command once more. Result:

1 #foo
2 zab

The first line was removed but not inserted; this doesn't happen when
executing ddkP manually. The help file says that :normal stops on errors but
is it an error when the cursor just can't move one line up?

I don't know what behaviour was intended, but I think it should either be
considered a bug or there should be an explicit hint in the help.

Best regards,
Mohammed

Ingo Karkat

unread,
Jan 6, 2013, 7:39:18 PM1/6/13
to vim...@googlegroups.com
On 04-Jan-13 12:58:15 +0900, Mohammed Chelouti wrote:

> Hello
>
> I have found an unexpected behaviour in the normal command and I am not sure
> if it is a bug or just not explicitly mentioned in the help.
>
> Consider the following file (# depicts the cursor):
>
> 1 foo
> 2 #bar
> 3 zab
>
> Now enter :norm! ddkP, the file should now look like this.
>
> 1 #bar
> 2 foo
> 3 zab
>
> So far so good, execute the same command once more. Result:
>
> 1 #foo
> 2 zab
>
> The first line was removed but not inserted; this doesn't happen when
> executing ddkP manually.

When you type this manually, you're effectively executing this:

execute 'norm! dd' | execute 'norm! k' | execute 'norm! P'

And this indeed doesn't stop.

> The help file says that :normal stops on errors but is it an error
> when the cursor just can't move one line up?

Yes it is. The beep that is issued is a clear indication of the error.

> I don't know what behaviour was intended, but I think it should either
> be considered a bug or there should be an explicit hint in the help.

Yes, it is intended, and it's very helpful to abort (recursive) macros. And the
reference in the help is exactly what you've quoted. Sorry that some Vim
peculiarities are so hard to discover, but I guess that's the price one has to
pay for such a powerful editor.

-- regards, ingo

Andy Wokula

unread,
Jan 7, 2013, 5:21:15 AM1/7/13
to vim...@googlegroups.com
And one more hint in the help is
:h map_return

it applies because arguments from :normal are like arguments from a
mapping (although :h :normal says "{commands} are executed like they are
typed." ... which is a bit misleading (it should say "{commands} are
executed like coming from a mapping"))

There is one weird detail though:
Without [!], :normal continues.
Same for a mapping for which remapping is allowed: it continues
after the error.
I actually didn't notice this before.

--
Andy

Mohammed Chelouti

unread,
Jan 7, 2013, 1:11:12 PM1/7/13
to vim...@googlegroups.com
On Monday 07 January 2013 09:39:18 Ingo Karkat wrote:
> Yes it is. The beep that is issued is a clear indication of the error.

Apparently my speakers are disabled and visualbell is not set. That explains
why I was confused by the lack of feedback. :)

Thanks for clarifying that.

Best regards,
Mohammed
Reply all
Reply to author
Forward
0 new messages