Boyko Bantchev wrote:
> On 8 August 2010 23:01, Bram Moolenaar <[email protected]> wrote:
> > ...
> > We are getting close to the 7.3 release! If nothing goes wrong I will
> > release 7.3 in less than a week. Last chance to report problems!
> > ...
>
> Bram,
>
> Great thanks to you for doing all this huge work on keeping Vim the
> best text editor. This work of yours helps so many people in the
> world, and in so many ways, to do their own work.
>
> The upcoming 7.3 release will no doubt improve on our experience
> with Vim, as all previous have done. However, I am concerned that
> the problems with Vim language's basic input and output about which
> I wrote several times, are, it seems, going to remain in 7.3 – and
> that means for at least another couple of years or more.
>
> Please reconsider this!
>
> One way to use Vimscript is to write and execute simple REPLs in the
> editor. A number of useful utilities, as well as educational programs
> can be written this way. Simple and reliable I/O primitives are
> essential to this, but, alas, Vim's :echo and input() have serious
> bugs each, and are even more problematic when used together. Said
> problems can be circumvented, I guess, but at the expense of ugliness
> and inconvenience reproduced in every single script. This would
> continually repel especially potential new users of Vim.
>
> I am once again describing the bugs and incosistencies I know of, in
> the hope that this would help to change your mind w.r.t. them. I am
> mostly repeating my previous posts but exposing the issues a bit more
> systematically.
I am not going to change this now, because:
- it's not a new problem in 7.3
- it is going to be incompatible with previous versions, some scripts
may need to be adjusted
- knowing how Vim does this it's possible to make it work
> Thank you for your attention, best regards,
> Boyko
>
> ~~~~~~~~~~~~~~~~~~~~~~~~~
>
> ==1==
> The documentation says that echo “… starts on a new line” but this
> is broken in at least several cases:
>
> (a) empty strings, e.g.
> for s in ['abc', '', 'def'] | echo s | endfor
> prints
> abc
> def
> rather than
> abc
>
> def
It only starts a new line if you have output something. Change the
empty string to ' ' and it works.
> (b) this doesn't look like empty strings but still:
> echo "abc\n" | echo "def"
> is supposed to output
> abc
>
> def
> but instead prints
> abc
> def
This works:
echo "abc\n " | echo "def"
abc
def
> (c) after a call of input(), e.g. in
> let x = input('') | echo 'ABC'
> the ABC string goes to the same line as the input; similarly,
> let x = input('') | echo "\nABC"
> prints ABC on the line immediately following the input(), while
> it should really leave an empty line between that of input() and
> that with the ABC.
This is intentional, it avoids having to press Enter at the more-prompt.
You can echo the result of input() if you want to see it.
> ==2==
> The documentation says nothing about whether input() always starts
> on a new line or not. Simple tests such as e.g.
> echo ">>>" | let x = input('')
> lead one to concluding that it does. However, then,
> while 1 | let x = input('A') | echo "R\n" | endw
> should be expected to print empty lines between each "R\n" and the
> subsequent input('A') but it does not – that contradicts the
> assumption that input() always moves to a new line at start.
It's difficult to explain how this works and probably also depends on
options settings, such as 'shortmess'. You can see what happens.
> (Besides, the echo is again erroneous as described in (c) above.)
Please don't call things an error when it might actually be intended
behavior.
> ==3==
> Reducing the "R\n" in the above example to just "R":
> while 1 | let s = input('A') | echo 'R' | endw
> exhibits an even stranger behaviour. For a start, just enter several
> empty lines to each input() before breaking the loop: not only is the
> 'R' printed on the same line as 'A' (which it shouldn't) but each new
> 'R' is displaced more and more to the right.
That looks like a bug.
> ==4==
> Once input() finishes, both the prompt and the entered string are
> being removed from display. Apart from this being, I believe, a
> wrong behaviour in itself, it, again, is not consistently manifested.
> This is easily seen by trying the last example above, this time
> entering non-empty lines. One can see that the implicitly echoed
> input is fully or partially (depending on its length) retained –
> which is probably a particular manifestation of some of the other
> bugs I mentioned (or perhaps a remnant of a correct behaviour).
>
> Also, the input()'s display, both the prompt and the entered text,
> is not removed if a single command such as
> :let x = input('PROMPT: ')
> is executed.
>
> I believe that input() should *never* remove the entered text, as well
> as the prompt, if any. Provided that it ends without moving to a new
> line, it shoild still be possible, if that is wanted, to erase the
> said text by ‘echon’-ing \r or \b. If removal is the default and
> one wants to keep the input, one would have to re-echo what he just
> typed in, which I think is much less natural.
The behavior of messages is very complicated. It's a compromise between
keeping the text the user might want to read and avoiding an annoying
hit-enter prompt. These things can't be solved by looking at only one
side of the problem.
--
Time is an illusion. Lunchtime doubly so.
-- Ford Prefect, in Douglas Adams'
"The Hitchhiker's Guide to the Galaxy"
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.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