Vim的:函数getline和非ASCII字符
问题描述:
我用一个单一的功能(即一个创建)知道,如果角色旁边的当前光标位置是空间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 == ' '
答
不幸的是,没有这是我意识到的做法。 :h getline
没有提及编码选项,从this vim mailing list I found,似乎这个问题已经存在了一段时间没有解决。
但是,我弄清楚了一个黑客的解决办法。而不是使用字符串,您可以改为使用字符列表。索引到这将给你整个字符,而不是单个字节。试试这个:
let ligne = split(getline(position[1]), '\zs')
感谢您的快速回答。不幸的是,这似乎不起作用 –
我认为这是因为我需要调整当前角色的位置。 'let car_suivant = ligne [position [2]]' –
@Maïeul你能澄清一下哪些工作不正常吗? 'split(getline(n),'\ zs')'返回一个字符列表,并且将它索引到非ASCII位置仍然返回单个非ASCII字符,所以我不确定哪些不起作用。 – DJMcMayhem