2017-10-19 151 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