【vim】文字列に含まれる半角も全角も一文字として処理する方法

img:

vimで文字列のフォーマットに失敗した際にハマったのでメモ。

例えば、それなりに長い文字列を程よく改行して折り返したいとします。その際の文字数のカウントで1byteと2byteの文字が入り混じった文字列の場合は、数を正しくカウントできずに潰れちゃって改行されません。理屈としてはそうなって当然なんですが...

img:

そんなときはsplit関数で文字列を文字に分割すれば、半角全角に関係なく一文字としてカウントできます。split()は第二引数を省略した場合、または空文字列の場合は、対象を空白文字で区切った各文字が要素になるとのこと。

for c in split(mystring, ¥zs)


    :let no = 0
    :let st = ''
    :let line = '本名:森田 一義(もりた かずよし)。血液型はO型。福岡県福岡市南区出身。田辺エージェンシー所属。'
    :let line .= '妻は2歳年上の一般人で自身の個人事務所の社長を務めている。妻との間に子どもはいない。女優の伊佐山ひろ子とは遠戚。'

    for c in split(line, '¥zs')
        :let st .= c
        if no % 20 == 0
            :let st .= '¥n'
        endif

        :let no += 1
    endfor

    put=st

img: