Vim:getline和non ascii字符

时间:2017-10-19 18:53:05

标签: character-encoding vi

我使用单个函数(创建)来了解当前光标位置旁边的字符是否为空格

function Test_caractere_suivant_espace()
"Test si le caractère suivant est une espace"
    let position = getcurpos()
    let ligne = getline(position[1])
    let car_suivant = ligne[position[2]]
    if car_suivant == ' '
        return 1
    else 
        return 0
endfunction

效果很好......但仅限于Ascii字符,而不是UTF-8中的Ascii字符。

当然,我可以尝试当前字符的两个第一位的值,但无论如何在getline返回的数组中都有UTF-8字符,而不是一个字节值的列表?

解决方案

DJMcMayhem建议使用

解决方案
 let ligne = split(getline(position[1]), '\zs')

但确定下一个角色仍有问题。 这是函数的新版本

function Test_caractere_suivant_espace()
"Test si le caractère suivant est une espace"
    let position = getcurpos()
    let ligne = split(getline(position[1]), '\zs')
    let car_suivant = ligne[position[2]]
    echom car_suivant
    if car_suivant == ' '
        return 1
    else 
        return 0
endfunction

在这一行

α α α α α α α α α α

如果我在前一个α之前调用该函数,我得到

Error detected while processing function LB_content[2]..Test_caractere_suivant_espace:
line    4:
E684: list index out of range: 25
E15: Invalid expression: ligne[position[2]]
line    5:
E121: Undefined variable: car_suivant
E15: Invalid expression: car_suivant
line    6:
E121: Undefined variable: car_suivant
E15: Invalid expression: car_suivant == ' '

1 个答案:

答案 0 :(得分:1)

不幸的是,我没有办法做到这一点。 :h getline没有提及任何编码选项,而且从this vim mailing list I found开始,似乎这个问题已经存在了一段时间而没有修复。

然而,我确实找到了一个hacky解决方法。您可以使用字符列表来代替使用字符串。索引到它将为您提供整个字符而不是单个字节。试试这个:

    let ligne = split(getline(position[1]), '\zs')