Yegappan wrote:

> The language server protocol messages use character column number
> whereas many of the built-in Vim functions (e.g. matchaddpos()) deal
> with byte column number.
> 
> Several built-in functions were added to convert between the character
> and byte column numbers (byteidx(), charcol(), charidx(),
> getcharpos(), getcursorcharpos(), etc,).
> But these functions deal with strings, current cursor position or the
> position of a mark.
> 
> We currently don't have a function to return the byte number given the
> character number in a line in a buffer.  The workaround is to use
> getbufline() to get the entire buffer line and then use byteidx() to
> get the byte number from the character number.
> 
> I am thinking of introducing a new function named charcol2bytecol()
> that accepts a buffer number, line number and the character number in
> the line and returns the corresponding byte number.  Any
> suggestions/comments on this?
> 
> We should also modify the matchaddpos() function to accept character numbers
> in a line in addition to the byte numbers.

Just to make sure we understand what we are talking about: This is
always about text in a buffer?  Thus the buffer text is somehow passed
through the LSP to a server, which then returns information with
character indexes.

One detail that matters: Are composing characters counted separately, or
not counted (part of the base character)?

Also, I assume a Tab is counted as just one character, not the number of
display cells it occupies.

I wonder if it's really helpful to add a new function if it can
currently be done with two.  You already mention that the text can be
obtained with getbufline(), and then get the byte index from the
character index with byteidx().  What is the problem with doing it that
way?

Other message:

> Another alternative is to extend the col() function.  The col()
> function currently accepts a list with two numbers (a line number and
> a byte number or "$") and returns the byte number.
> This can be modified to also accept a list with three numbers (line
> number, column number and a boolean indicating character column or
> byte column) and return the byte number.

I don't like this, the first line for the col() help is:

        The result is a Number, which is the byte index of the column

When the boolean is true this would be the character index, that is hard
to explain.  A user would have to look really hard to find this
functionality.

There is also charcol(), it appears to be doing what you want already.


-- 
hundred-and-one symptoms of being an internet addict:
92. It takes you two hours to check all 14 of your mailboxes.

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20221121000400.7E0B41C12B9%40moolenaar.net.

Raspunde prin e-mail lui