Ответ на сообщение «Re: col() in lines with apostrophe characters», присланное в 20:15:39 14 марта 2010, Воскресенье, отправитель Ingo Karkat:
> let len = strlen(substitute(str, ".", "x", "g")) Never use this. It is three orders of magnitude slower than let len=len(split(str, '\zs')) You can test this by launching vim -u NONE -c 'source test.vim' My results are located in «strprofile» file. Note that both methods assume that one symbol is symbol+combining diacritics (if any). Текст сообщения: > On 14-Mar-2010 17:49, Gregor Uhlenheuer wrote: > > Hello, > > I think the col() function does not work properly for lines with > > apostrophe characters (`´). > > > > :echo col([line('.'), '$']) returns 6 on the line below: > > > > ´foo > > > > It should return 5 I think. > > It depends on the encoding of the apostrophe character, as col() returns > byte indices, not logical characters. You assume that the apostrophe uses > only one byte, whereas it seems that it actually uses two bytes. > > To investigate, check the 'encoding' and 'fileencoding' settings, and use > the g8 command on the apostrophe character; it'll return the (UTF-8) byte > sequence used to encode it. (This is a somewhat simplified explanation, > it's a quite complex matter.) > > For many scripting uses, Vim's byte-orientation makes it difficult to > properly deal with multi-byte strings, but there are ways to cope. For > example, to count the number of characters, use > let len = strlen(substitute(str, ".", "x", "g")) > > -- regards, ingo >
FUNCTION Test1() Called 1 time Total time: 2.502438 Self time: 2.502438 count total (s) self (s) 1 2.502431 return len(substitute(a:str, '.', '.', 'g')) FUNCTION Test2() Called 1 time Total time: 0.036501 Self time: 0.036501 count total (s) self (s) 1 0.036494 return len(split(a:str, '\zs')) FUNCTIONS SORTED ON TOTAL TIME count total (s) self (s) function 1 2.502438 Test1() 1 0.036501 Test2() FUNCTIONS SORTED ON SELF TIME count total (s) self (s) function 1 2.502438 Test1() 1 0.036501 Test2()
let s:str=string(range(1, 10000)) function Test1(str) return len(substitute(a:str, '.', '.', 'g')) endfunction function Test2(str) return len(split(a:str, '\zs')) endfunction profile start strprofile profile func * call Test1(s:str) call Test2(s:str) q!
signature.asc
Description: This is a digitally signed message part.