2017-10-19 20 views
1

私はなく、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 

であるかどうかを知るために(作成すること)単一の関数を使用しますUTF-8のAscii文字ではありません。

もちろん、現在の文字の最初の2ビットの値を試すことができますが、配列にUTF-8文字がある場合は、getlineが返され、1バイトの値のリストは返されません。

ソリューション

DJMcMayhemのPISTは

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

を使用してソリューションを提案しかし、次の文字を決定する問題がまだあります。私は残念ながら最後のα前に、私が手

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

で関数を呼び出す場合 は、ここでは、このライン

α α α α α α α α α α 

で機能

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 

の新バージョンである、ありますなし私が知っているこれを行う方法。 :h getlineはエンコーディングオプションについては何も言及しておらず、this vim mailing list I foundから、この問題は修正されずにしばらくの間そうだったようです。

でも、私はハックのある回避策を見つけました。文字列を扱う代わりに、代わりに文字のリストを扱うことができます。これにインデックスを付けると、個々のバイトではなく文字全体が得られます。試してみてください:

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

このクイックアンサーをありがとう。不幸にも、それは動作していないようだ –

+0

私は現在の文字の位置を適応させる必要があると私は思う。 'let car_suivant = ligne [position [2]] –

+0

@ Maeeul正確に動かないものを明確にすることはできますか? 'split(getline(n)、 '\ zs')'は文字のリストを返し、ASCII以外の位置にインデックスを付けると非ASCII文字が1つ返されるため、何が動作していないのか分かりません。 – DJMcMayhem

関連する問題