Tom M wrote:

> > On Thu, Mar 29, 2018 at 2:06 PM, Bram Moolenaar <b...@moolenaar.net>
> > wrote:
> >
> >>
> >> Tom M wrote:
> >>
> >> > First of all, thank you for VIM. Now, I'd like to share an example of
> >> > a rather confusing behaviour. It's the ':file' ex command when used in
> >> > combination with the # register. Here is how to reproduce:
> >> >
> >> > vim -N -u NONE -U NONE --noplugin somefile.txt
> >> >
> >> > :file
> >> > =>
> >> > "somefile.txt"
> >> >
> >> > :file <CTRL-R>#
> >> > =>
> >> > :file "
> >> > E23: No alternate file
> >> > :file |
> >> > (vim still in ex cmd input mode with the cursor positioned where '|' is)
> >> >
> >> > otherfile.txt
> >> > (this finishes the input of ':file otherfile.txt' ex command.)
> >> >
> >> > :file
> >> > =>
> >> > "somefile.txt"
> >> >
> >> > IOW the resulting 'file otherfile.txt' command failed without warning.
> >> Is this a bug or a "feature"? Because this definitely doesn't feel right. I
> >> would expect one of these results (in my order of preference):
> >> >
> >> > 1) The 'file otherfile.txt' ex cmd goes through so that ':file' gives
> >> 'otherfile.txt' in the end.
> >> > 2) Immediate abort after E23.
> >> > 3) Or at least some notification that the file was not changed to
> >> 'b.txt'.
> >> >
> >> > This is VIM 8.0.1648 on a Linux machine. VIM 7.4 is affected too.
> >>
> >> I can reproduce it.  So the suspicion is that the error for the missing
> >> register causes the command to fail later.
> >>
> >>
> > ​It's my very first look into the source code. I'm not able to come up
> > with a patch alone. Anyway, in 8.0.1648 I am seeing this:
> >
> > buffer.c    3230    getaltfname() EMSG(_(e_noalt));
> > ex_docmd.c  2000    do_one_cmd() ea.skip = did_emsg || got_int || ...
> >
> > So when "E23: No alternate file" is displayed, did_emsg is set to TRUE.
> > Then later in do_one_cmd() ea.skip is set to TRUE because of
> > did_emsg==TRUE.  ea.skip variable is described as "don't execute the
> > command, only parse it".  Indeed, further code of the function parses the
> > ex command but stops right before executing it when it sees that ea.skip is
> > TRUE. Obviously, preventing the ea.skip variable to become TRUE would get
> > the ex command executed and fix the issue for me. But surely the ea.skip
> > thing was put there for a reason. I cannot exactly guess the exact reason
> > just now.
> >
> > Maybe it's something like "an error occured, proceed to next ex command".
> > But why not abandon the execution right after E23? Why let the user correct
> > his entry when we know the ex cmd is going to be skipped either way? Why
> > let vim's code execution reach do_one_cmd() when the E23 is displayed quite
> > a few fn calls sooner?
> >
> > Eperiments show that the problem is "generic" somewhat. E.g. ":echo
> > <CTRL-R>#" is affected in the same way. So it's not the ":file" ex cmd
> > only. So maybe, when issuing an error message, vim should somehow
> > distinguish between fatal errors (then set did_emsg=true) and non-fatal
> > errors (like E23 in this case) and perhaps only do something like
> > did_warn=true.
> >
> > BTW, as mentioned earlier, another kind of fix that would work for me is
> > to just alert the user when the ":file" ex command is aborted.
> >
> > So, can someone shed some light for me on (1) the ea.skip thing or (2) how
> > to do the alerting or (3) how to prevent forther's user input after the E23
> > or (4) how to distinguish between "fatal" and "non-fatal" errors, please?
> > Or, even better, come up right with a proper patch? :-)
> >
> > Thanks,
> >
> > Tom
> >
> >
> ​Experiments inspired by the code of get_spec_reg() show that what's
> affected is input of any ex command that involves <CTRL-R> followed by '#',
> '%', '=1+' (any invalid expression), '<CTRL-F>', '.' or ':' in
> corresponding specific situations.
> Examples:
> 
> :file <CTRL-R>%i_2.txt " with no current file
> :echo "alt file is: <CTRL-R>#" " with no alternate file
> :let x=<CTRL-R)=x+ " any syntactically incorrect expression
> :sp <CTRL-R><CTRL-F>other.txt " on empty line
> :echo "last cmd: <CTRL-R>:" " as first ex command
> 
> Here is a patch I managed to come up with. It solves the issue for me. The
> ex commands after E23 (and friends) go through. I'll be happy to hear your
> oppinion. (But it's my first, so go easy on me ;-)

Thanks.   I don't think it is needed to save the previous value of
did_emsg.  It is reset at the start of getcmdline() anyway.  I'm even
tempted to reset it in the loop, before getting the next character.
There can't really be a reason why an error that occurs while typing a
command should cause the command not to be executed.  Unless perhaps the
command wasn't typed, but resulting from a script.  But making a
difference between something that was typed or not makes life more
difficult.  So lets not use this check up front.


-- 
I AM THANKFUL...
...for all the complaining I hear about the government
because it means we have freedom of speech.

 /// Bram Moolenaar -- b...@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_dev" 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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui