So is it possible to set COMP_POINT as the number of characters between 0 and rl_point (if it is also bad to break libreadline api by setting rl_point as that.) without screwing up other part of the code? (I hope this fix would be no more than searching for rl_point and replace wherever necessary.)
Treating ${#COMP_LINE} separately is definitely not a good solution I think, since there is also all kinds of related operation such as ${COMP_LINE:a:b} etc (as what is done in bash-completion package) and if u set line=${COMP_LINE} it will be REALLY weird if ${#line} and ${#COMP_LINE} are different. (The only point for this fix might be consistency with the manual~~) On Tue, Mar 27, 2012 at 2:00 PM, Chet Ramey <chet.ra...@case.edu> wrote: > On 3/22/12 6:59 PM, yyc1...@gmail.com wrote: > >> Bash Version: 4.2 >> Patch Level: 24 >> Release Status: release >> >> Description: >> The variable COMP_POINT is actually set to the size (not the length) >> of the command line before the cursor, whereas ${#COMP_LINE} returns the >> length of the string. This behavior make it hard to determine where the >> cursor is when the commandline contain non-ascii characters and it is NOT >> consistent with the statement in bash(1) which says these two are the same >> when the cursor is at the end of the line. > > Yes, this is an interesting dilemma. COMP_POINT reflects the value of > rl_point, which is readline's view of the current insertion point. > rl_point is a byte value: the index into the readline line buffer. > Readline handles the conversion to and from and display of multibyte > characters internally while implementing everything as an array of bytes. > COMP_LINE is also an array of bytes, but Posix specifies that the > ${#word} expansion returns the number of *characters*. Maybe the thing > to do is to special-case COMP_LINE so thst ${#COMP_LINE} returns > strlen(rl_line_buffer), but that's also sure to displease somebody. > > Chet > -- > ``The lyf so short, the craft so long to lerne.'' - Chaucer > ``Ars longa, vita brevis'' - Hippocrates > Chet Ramey, ITS, CWRU c...@case.edu http://cnswww.cns.cwru.edu/~chet/