2017-10-19 15 views
1

J'utilise une seule fonction (que créer) de savoir si le personnage à côté de la position actuelle du curseur est un espaceVim: getline et le caractère non 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 

Il fonctionne bien ... mais seulement avec des caractères Ascii , pas avec des caractères non ASCII en UTF-8.

Bien sûr, je pourrais essayer la valeur des deux premiers bits du caractère actuel, mais y at-il de toute façon des caractères UTF-8 dans le tableau retournés par getline et non une liste de valeurs d'un octet?

Une pist de solution

DJMcMayhem suggèrent une solution à l'aide

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

Mais il y a encore un problème pour déterminer le caractère suivant. Voici la nouvelle version de la fonction

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 

Dans cette ligne

α α α α α α α α α α 

Si j'appelle la fonction dans l'avant-dernier α, je reçois

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 == ' ' 

Répondre

1

Malheureusement, il n'y a pas façon de le faire que je suis conscient de. :h getline ne mentionne rien sur les options de codage, et de this vim mailing list I found, il semble que ce problème a été autour pendant un certain temps sans aucun correctif.

Cependant, j'ai trouvé une solution de contournement hacky. Au lieu de travailler avec des chaînes, vous pouvez travailler avec une liste de caractères à la place. Indexer dans cela vous donnera des caractères entiers au lieu d'octets individuels. Essayez ceci:

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

Merci pour cette réponse rapide. Malheureusement, il semble que cela ne fonctionne pas –

+0

Je pense que c'est parce que je dois adapter la position du personnage actuel. 'let car_suivant = ligne [position [2]]' –

+0

@ Maïeul Pouvez-vous clarifier ce qui ne fonctionne pas exactement? 'split (getline (n), '\ zs')' renvoie une liste de caractères, et l'indexer sur des positions non-ASCII retourne toujours des caractères non-ASCII, donc je ne suis pas sûr de ce qui ne fonctionne pas. – DJMcMayhem