現在絶賛作業中なのでまだ完成してないですがぼちぼちあげるのも面白いなぁと
Qiita-vimとは
@mattn氏作の、vim
からQiita
への投稿、閲覧、更新など色々できるプラグインです。
しかし最終更新日時が6年前、Qiita API v2
に対応していないため現在使うことができません。
しかしどうしてもvimからQiitaを使いたい(Qiita書くためだけにGUI環境に出てきたくない)ので、自分でなんとか対応させてみることにしました。
Github: mattn/qiita-vim
作業中のfork: Cj-bc/qiita-vim, feature/v2
branch
デバッグ方法
主には、:debug
と変数の定数置き換えによってデバッグしました。:debug
についてはちょっと書いたのでこちらを: Cj-bc/vim scriptデバッグ方法
定数書き換えとは
勝手に呼んでいるだけです()
挙動が怪しいなと思ったところを定数に書き換え、同時に複数の不具合が起こらないようにしました。
今回は、固定できるところ、つまりself.url_name
(QiitaのURLにある名前。@
以下のやつ。)を自分の名前(Cj-bc
)に固定したり、
今回のケースでは省いてもそこまで問題がなさそうな処理を省いたりしました。
例を置いておきます、コメントアウトされているのがテストのためにいじったコードです。具体例ですがほんのちょっとだけ長くなるのでしまっておきます
実際のデバッグ時にはそれらのコメントアウトを外し、既存の該当する部分と置き換えて走らせました。...trylet old_undolevels =&undolevels
silent %d _
redraw|echon'Listing items... 'let items =a:api.user(a:user).items()"call setline(1, split(join(["this is test", "second line"], "\n"))) " for debug"call setline(1, split(join(map(items, 'v:val.uuid . ": " . v:val.title'), "\n"), "\n")) " for debug 2call setline(1, split(join(map(items,'v:val.uuid . ": " . webapi#html#decodeEntityReference(v:val.title)'),"\n"),"\n"))catchbw!...
function!s:user.items()"let res = webapi#json#decode(webapi#http#get(printf('https://qiita.com/api/v2/users/%s/items', 'Cj-bc'), {'token': self.token}).content)letres= webapi#json#decode(webapi#http#get(printf('https://qiita.com/api/v2/users/%s/items', self.url_name),{'token': self.token}).content)if type(res)==4&& has_key(res,'error')throwres.error
endifif type(res)!=3throw'invalid response'endif...
APIをv2に書き換える
これは至極単純で
:%s/v1/v2/g
で行いました。
一応、間違って置換されてないか確かめるために/v2
で確認もしました
2. うまく走らないのをなんとかする
大雑把ですがめっちゃ時間かかりました...
ちなみに、大掛かりにデバッグとかしてますが遠回りしただけだったりします(単純に仕様変更のせいだったりした)
2.1 Vim(call):E716: Key not present in Dictionary: uuid . ": " . v:val.title
これです
これは結局、APIの仕様変更に伴い削除された値を読みに行っていたのが問題でした。
具体的にはここ
call setline(1, split(join(map(items,'v:val.uuid . ": " . webapi#html#decodeEntityReference(v:val.title)'),"\n"),"\n"))
github
使用されているAPI: /api/v2/users/:user_id/items
前後のコード読まないとなんともわからないとは思いますが、v:val.uuid
の部分が違っていました。
これ、uuid
は削除されてるんですね...v2
だと...
代わりにid
なるものがありましたので、置き換えたら動きました。やったね。
解決までの道のり
call setline(1, split(join(["this is test","second line"],"\n")))
まずこれで置き換えてエラーが出ないことを確認。置き換える前の部分に問題があるなと推定(ちょっと雑すぎるかも?)
call setline(1, split(join(map(items,'v:val.uuid . ": " . v:val.title)'),"\n"),"\n"))
webapi#html#decodeEntityReference
の部分は、URLエンコードを外すためのものらしく、今回の件とは関係なさそうなのでとりあえず外す。
この時点で文字列は表示されてなかったため、URLエンコードされたままでもまぁ問題ないと判断。
これでもエラーが出る& エラーが.uuid
で始まることから、uuid
を疑う。
ここでリファレンス見たらuuid
なるものが存在せず、代わりにid
なるものがあるので使って見た。
そしたら動いたので置換しておいた。
ここまで約1日かかった...エラーからすぐに見破れなかったのはちょっと悲しい
この後webapi#html#decodeEntityReference
ももとに戻してエラーが出ないことを確認、この部分についてはおそらくこれで完了
この先も随時更新しまふ