2017-10-19 153 views
1

我用一个单一的功能(即一个创建)知道,如果角色旁边的当前光标位置是空间Vim的:函数getline和非ASCII字符

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一个PIST建议使用

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

不幸的是,没有这是我意识到的做法。 :h getline没有提及编码选项,从this vim mailing list I found,似乎这个问题已经存在了一段时间没有解决。

但是,我弄清楚了一个黑客的解决办法。而不是使用字符串,您可以改为使用字符列表。索引到这将给你整个字符,而不是单个字节。试试这个:

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

感谢您的快速回答。不幸的是,这似乎不起作用 –

+0

我认为这是因为我需要调整当前角色的位置。 'let car_suivant = ligne [position [2]]' –

+0

@Maïeul你能澄清一下哪些工作不正常吗? 'split(getline(n),'\ zs')'返回一个字符列表,并且将它索引到非ASCII位置仍然返回单个非ASCII字符,所以我不确定哪些不起作用。 – DJMcMayhem