Ilya Zakharevich on Mon, 17 Sep 2001 12:34:03 -0400 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Space removal from the user input |
On Sat, Sep 15, 2001 at 12:19:39PM +0000, Karim Belabas wrote: > On Wed, 5 Sep 2001, Ilya Zakharevich wrote: > > > a1) When GP/PARI reads something, the output is echoed *after* the > > whitespace is removed. Is this intentional, or "it just happens > > this way"? > > > > a2) Similarly for the readline's history. (It contains your's input > > with whitespace removed.) > > It was just easier that way. Hmm, I think that most probably it was me who implemented this, and most probably I just missed the fact that addhistory() does not copy, but keeps the pointer, and the space-removal algorithm does it by modifying the string. > The one important point was that multiline input > should be remembered as a single line (much easier to modify user functions > this way). Wrong. It is much easier to modify things when the whitespace you inserted is preserved. Especially the newlines which you take care to insert... [While writing this, I tried for the first time having {} when inputing from the keyboard (as opposed to having explicit newlines entered via C-v C-j). I see that what you input is not added to readline history until you finish. This is a no-no-no. I think the correct strategy when you enter { bar; baz; foo; } is to have "{ bar;" and "baz;" available in the history when the final line is being entered. When the final line is entered, these "uncomplete" lines should be removed from the history, and a "3-line-long" entry should "replace them in history".] The only drawback of the multiline editing (I mean readline-with-embedded-new-lines) is that mouse editing (which I implemented in xterm last week) is currently restricted to one-wrapped-line mode. [With my patches to xterm mouse clicks (may) act as in Emacs, so with ReadLine+XTerm you get all the bests of both cmdtool and ReadLine.] > For memory efficiency reasons (not such a concern nowadays of > course...), It never was - at least, for readline-in-GP. > It is not trivial though: the catch is to determine whether input is complete > or not, and this is hard to do without running the filter (e.g nice things > like { "}" /* } */ } and so on...). One would have to separate the > "preprocessor" (removing comments, block delimiters) from the "filter" > (removing spaces). I think this is exactly what the *current* implementation does (witness what happes when you enter { }.) > > b) When processing multiline-input from readline, \n is removed too > > agressively. Example: type > > > > print(1) ^V ^J print(2) ENTER > > > > (here ^V and ^J are control-chars). I see: > > > > ? print(1) > > print(2) > > *** unused characters: print(1)print(2) > > > > i.e., \n in the input is removed, resulting in a "wrong error". > > > > Should not filtre() replace '\n' with ';' when in f_READL mode? > > I don't know. 1 ^V^J 2 is definitely not the same as 1; 2 [the former > should store the results "1" and "2" in the history, and output them both; > the latter will disregard "1"]. Both should disregard "1". The history should contain the input in units specified by the *the user*. If the user enters ^V^J, he clearly wants these two lines to be considered as a unit. When these bugs are fixed, I would think of binding ^J to denote ^V^J by default. It is *very convenient* not to fight with the "long-wrapped-line" mess. Ilya