Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Qiita-vim復活させた(い)話(作業中)

$
0
0

現在絶賛作業中なのでまだ完成してないですがぼちぼちあげるのも面白いなぁと

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)に固定したり、
今回のケースでは省いてもそこまで問題がなさそうな処理を省いたりしました。

具体例ですがほんのちょっとだけ長くなるのでしまっておきます

例を置いておきます、コメントアウトされているのがテストのためにいじったコードです。
実際のデバッグ時にはそれらのコメントアウトを外し、既存の該当する部分と置き換えて走らせました。

list_user_items()
...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!...
user.items()
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

これです

qiita-vim-err-uuid.gif
)

これは結局、APIの仕様変更に伴い削除された値を読みに行っていたのが問題でした。
具体的にはここ

list_user_items()
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ももとに戻してエラーが出ないことを確認、この部分についてはおそらくこれで完了


この先も随時更新しまふ


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>