sci

最果て風呂

Vim の変数のスコープについて - 完結編 -

前の投稿からずいぶんと経ってしまったのですが、これは下記の記事から続いているお話です。

続 Vim のウインドウ変数とバッファ変数と
Vim のウインドウ変数等について調べたのだが...
Vim の変数のスコープについて調べたら「わかってない」ということがわかった

あれからいろいろと実験を重ねてみたものの、残念ながら Vim のスコープを体得することは出来ませんでした。しかし、ある種の悟りを開くこともできましたので、ここでお知らせしたいと思います。

名前が被さらないように全部グローバル変数にしておけ

これです。「ファイルを編集する度に Vim の起動・終了を繰り返す」という自分の使い方からして、変数の過去がどのようなものであったのかなんて、気にする必要はなかったのです。毎回新しいのですから。そう、例えれば「彼女の過去を気にしない、今の彼女だけをみつめる」そんなタマタマの大きな男でありたいものです。

...

実は上記には大きな嘘が隠されています。やはり本当のことを見つめるのは辛いものなのです。もっともらしい理由を書いてお茶を濁そうとしていました。正直に申しましょう。それは

「自分で書いた Vimscript は自分しか使わないので、困るのは自分だけ」

う〜む、学校のトイレで弁当を食べているような感じが漂ってきますね...

そもそもテキストエディタを使うのに何でスコープを知らなあきまへんのや。アホな話しちゃいますか?

Vim を使うために自分を合わせる必要はなくて Vim を自分に合わせればいい

んですよ。何も悩む必要はありません。各人の使い方をすれば OK なのです。

...

実は上記には大きな嘘が...

前口上はこのくらいにして、本題に入りましょう。

私は Vim を使うにあたり、skk.vim と twitvim.vim という 2 つのプラグインのみを利用しています(何せ非力なマシンですので...)。で、自作のスクリプトから直接 twitvim を利用して Twitter に投稿できないものかと考えていたのでした。

自作のスクリプトというのは今までに何度も登場しておりますが、標準語を関西弁に変換する(予定)というものです(辞書はまだない)。つまり、日記には標準語で入力しておいて、関西人向けの発言にはエセ関西弁に変換して tweet してやろうという浅はかな企みであります。

twitvim 内にある投稿関数を利用できないものかと実験しては落胆を繰り返し、いつしか実験することもしなくなった頃、日本 Vim 界の重チンである mattn さんの記事「他人が作ったVimScriptを一切触らず拡張する」を見付けたのでした。

記事を参考に(というか丸パクリ)して、<SNR> という摩訶不思議な数値をゲットすることに成功し、また、外部スクリプトから関数を利用することができるようになったのでした。ありがとう、アリガトー。

コードはこんな感じになりました。採点して頂けますと幸いです。

" TwitVim から直接正かなでつぶやく
"" 下準備 twitvim.vim の SNR を得る。変数はスクリプトローカルで持つようにする
function! GetTwitVimSNRNumber()
    silent! redir => scripts
    silent! scriptnames
    silent! redir END
  
    let s:dict = {}
    let list = split(scripts, '\n', '')
    
    for x in list
        let script_num = substitute(split(x, '\s', '')[0], ':', '', '')
        let script_name = substitute(split(x, '\s', '')[1], '.*/\|.*\', '', '')
        let s:dict[script_name] = script_num
    endfor
endfunction

"" 下準備その2 文字列を変換する関数
""" かな使いだけ変換
function! ForTwitVimReplaceStringHiragana()
    let b:string = getline('.')
    call CreateDict(s:kana_jisyo)
    for cons in s:car_cdr_arr
        let b:string = substitute(b:string, cons[0], cons[1], 'g')
    endfor
endfunction
....
    
"" TwitVim を利用してつぶやく
""" かな使いを変換してつぶやく
function! SeikanaTweet()
    call GetTwitVimSNRNumber()
    call ForTwitVimReplaceStringHiragana()
    call function('<SNR>'.s:dict['twitvim.vim'].'_post_twitter')(b:string, 0)
endfunction
....

また、肝心の関西弁辞書も存在していない(^_^;)ので、参考文献などを提供してもらえますと、嬉しくて木に登っちゃいますっ!

ちなみに文字数をチェックしていないので、変換後の文字数が 140 文字を越えてしまうこともあるという不徹底ぶり(>_<)。.vimrc には下記の設定をして、ステータスラインで文字数を確認してはいるのですけどねぇ...

set statusline=%f\ %m%r%{'['.(&fenc!=''?&fenc:'?').'-'.&ff.']'} %{strchars(getline('.'))}%=%l/%L ",%v

最後に、私の悩みに付き合ってくれた thinca さん、ありがとうございましたm(__)m。

Vimスクリプト基礎文法最速マスター
Vim script の変数のスコープについてのお話

はとても参考になりました。