vimスクリプトで苦戦した件

仕事してる最中にエディタから思いついたことだの愚痴だの呪いの台詞だのをポイポイ投げ入れられたら便利じゃね? そらー便利だ。やるべやるべ。

というわけで、vimから「:TW」と入力すると小窓(バッファ)が開き、そこに文章を入力して改行したら(いまさらながら)twitterにポスト、なんてスクリプトを書くことにしたのが数週間前。

とりあえず、vim.orgのスクリプトを検索したら、似たようなプラグインスクリプトはあったんだけど、Pythonのライブラリを使うなど、あまりシンプルじゃない。マクロ自体はシンプルなんだけどね。

希望としては、curl(でもwgetでもいいんだけど)を使って、新しくナニカを導入せずに、スクリプトだけで制御したいこと。そうすると、Macでもシアワセになれるし。

なにはともあれ、twitterのAPIを調べてみると、たとえばcurlを使う場合、単に、

curl -u USERNAME:PASSWORD -d status="ほげほげ" \
     http://twitter.com/statuses/update.json

とすればいいだけ。

問題はアップしたいテキストの「ほげほげ」はUTF-8でURLエンコードしなければならない点。

JavaScriptでいうところの「charCodeAt()」をvimは持っていないので(まあ、ほかにもいろいろ持ってないけど)、この部分は実装しなければならない。もっとも、マルチバイト対応のvimであれば、UTF-8への変換はICONVを使って処理できるので、

execute 5 . new
setlocal enc=utf-8

として、文字コードにUTF-8を指定した5行分の窓(バッファ)を開け、入力した文字をエンコードすることにした。カンタンそうでしょ?

ところが、「getline(".")」で取得した文字コードはUTF-8ではなく、CP932として認識されてしまう。

たとえば「の」の場合、期待されるコードは「%E3%81%AE」なのだが、「%30%6E」が返ってくる。CP932でエンコードした文字列はtwitterは解釈してくれないので、当然、twitter上にはなにも表示してくれない。アクセスされてなにかがポストされたことは残るみたいだけど。

UTF-8になってないんじゃないかと考えて、エンコード関数のプロトタイプで「echo」してみると、ちゃんと「%E3%81%AE」と示される。つまり文字コードはあってる。

どうも小窓(バッファ)を開けたスクリプト本体に書いたエンコード関数からは、扱う文字データはすべてCP932として処理されているっぽい。なんのための「set enc=utf-8」やねんという話もあるのだけれど、「:wq」したファイルはUTF-8で保存されているので、そういう仕様なのだろう。

というわけで、小窓(バッファ)を開けるためにスクリプトを呼び出し、ポストするためにさらにスクリプトを呼び出すという、なんかもう非常にウザイ処理となっていて、お気軽にエディタから呪詛のコトバをtwitterに放り込むという当初の目標からはかなり遠いところに着地したわけです。くやしいー。きー。

もう少しブラッシュアップしたら(しないと思うけど)公開しようかとか考えてみたりみなかったり。

もっとも、Webアプリケーションを含む、別アプリケーションを立ち上げてログインして入力して……、なんてことからすると、大変気楽ではありますが。

Add New

Name

Email

Homepage

Security Word

Type in the security Word

Content (HTML not allowed)