※この記事は個人的なメモです。
こんにちは。
最近とても興味深い記事を見つけて、Vimをもっと使ってやろうと意気込んで、作ってみたものです。1
Vimで書いた*.mdファイルを簡単に投稿したかったので最近ハマっているPyhtonを使ってみました。
既存のVimプラグインも探したらありそうなものですが、別に投稿と更新さえできればいいので、作った方が早いかもと思った次第です。
機能の多すぎるプラグイン入れて起動速度落ちるのが嫌なのが主な理由...
NeoBandleをはじめとしたプラグインになるべく頼りたくない、素のVim使いたいとかいう人には参考になるかもです?
追記:
非常に完成度の高いvimプラグインがすでにありました↓
素晴らしいですね...
https://github.com/mattn/qiita-vim
普通にこれ使った方が良いです。
ちなみに、NeoBandleに比べて圧倒的に軽いvim-plugを普段から使っていますが、非常におすすめです。
ミニマリストの方は試してみると良いかもしれません。↓
https://github.com/junegunn/vim-plug
Qiita API
Qiita APIをPythonで叩くにはTokenを取得せねばなりません。
Token取得には「curl コマンドで Qiita API を試す方法」2がとても参考になりました!
Tokenが取得できたら
次は、Pythonから叩きます。
まずは、ディレクトリ構成を、
qiita-book --- qiita.py
|-- content.md
とってもシンプルです。
また、同一ディレクトリに記事を貯めていく形です。
では、とりあえずqiita.pyをのぞいてみましょう。
importrequestsimportsysif__name__=="__main__":tags=[]print('please input title:')title=input()iftitle=="q":sys.exit()foriinrange(5):print('Do you have any other tags?:y,n')ans=input()ifans=="q":sys.exit()ifansin'y':print('please input tags. if you need any other tags, you can set next input: ')tagadd=input()tags.append(tagadd)else:breakprint('please input filepath:')filepath=input()f=open(filepath,"r")id=f.readline()ifidin"ID:":id=f.readline().replace('ID:','')else:id=''item={'title':title,"coediting":False,'tags':[{"name":tag}fortagintags],'private':True,'tweet':False,'id':id}item['body']=f.read()f.closeurl='https://qiita.com/api/v2/items'token=!YOURACTOKENheaders={'Authorization':'Bearer {}'.format(token),'Content-Type':'application/json',}print(item)print(headers)res=requests.post(url,headers=headers,json=item)result=res.json()['id']iook="ID:"+resultf.close()fw=open(filepath,"w")fw.write(iook)fw.close()fw1=open(filepath,"a")body="\n"+item['body']fw1.write(body)fw1.close
思い立って数時間で書いたクオリティーです...笑
今度時間がある時もう少し書き直したいと思います。
ちなみに、コードの解説をすると。
importrequestsimportsys
requestsでjsonをpostしています。
sysは終了処理のためにインポートしています。
if__name__=="__main__":
これはPythonのお決まりですね。
print('please input title:')title=input()iftitle=="q":sys.exit()
ここでは、記事のタイトルを決めてtitle変数にinputしています。
foriinrange(5):print('Do you have any other tags?:y,n')ans=input()ifans=="q":sys.exit()ifansin'y':print('please input tags. if you need any other tags, you can set next input: ')tagadd=input()tags.append(tagadd)else:break
上記処理は、Qiitaのタグをtags変数にinputしています。
ちなみに、タグは最大5つまでなので、Do you have any other tags?:y,n でNoと答えるまで繰り返して、配列に格納しています。
print('please input filepath:')filepath=input()f=open(filepath,"r")id=f.readline()ifidin"ID:":id=f.readline().replace('ID:','')else:id=''
これは、同一ディレクトリ内にあるfile名、あるいは、そのほかのディレクトリにあるファイルパスをfilepath変数にinputして、一行目を読み込んでいます。
ここで、なぜ一行目だけ読み込むのかというと、更新する際、すでに投稿した記事と紐づけるため、IDをファイルの先頭に置いておく仕様にしているからです。
これで、変更の際にも、そのまま更新できます。
あと、未実装なのですが、tagsも引き継げるような仕組みを時間がある時加えたいと思っています。
item={'title':title,"coediting":False,'tags':[{"name":tag}fortagintags],'private':True,'tweet':False,'id':id}
jsonの形にしています。
ここで、tagsを繰り返して最大5つまで格納できるようにしています。
item['body']=f.read()f.closeurl='https://qiita.com/api/v2/items'token=アクセストークンheaders={'Authorization':'Bearer {}'.format(token),'Content-Type':'application/json',}
tokenには取得したアクセストークンをそれぞれ使いましょう。
直書きはよくないので、工夫した方が良いと思います。
res=requests.post(url,headers=headers,json=item)result=res.json()['id']iook="ID:"+resultf.close()fw=open(filepath,"w")fw.write(iook)fw.close()fw1=open(filepath,"a")body="\n"+item['body']fw1.write(body)fw1.close
最後に、requestsでpostしましょう。
result変数には更新の際に必要になってくるidを代入しています。
そのidをファイルの先頭に持ってくるため、一旦idだけを上書きして、その後投稿後の記事を追加しています。
ここまでできたら、あとはプレビュー機能が欲しくなってきます。
プレビュー機能はvim-plugの力を借りて、以下のように.vimrcに素晴らしいプラグインを加えます。
"vimプラグイン https://github.com/junegunn/vim-plug
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')
Plug 'plasticboy/vim-markdown'
Plug 'kannokanno/previm'
Plug 'tyru/open-browser.vim'
call plug#end()""" markdown {{{
autocmd BufRead,BufNewFile *.mkd set filetype=markdown
autocmd BufRead,BufNewFile *.md set filetype=markdown
" Need: kannokanno/previm
nnoremap <silent> <C-p> :PrevimOpen<CR> "
let g:vim_markdown_folding_disabled=1
"}}}
ここではCtrl+Pでプレビューできるようにしています。
あとはPythonの実行です。
Vimにはコマンドモードで!をつけてあげる事によってshellscriptを実行したりできる機能があり、その機能を借りてpythonスクリプトを実行します。
:!python qiita.py
これでVimでQiitaを投稿できるようになりました。
色々と問題ありですが、ゆっくり更新していきたいなと思います。
最後にVimで記事を編集している様子をあげておきます。↓
参考.
「vimって極めればvscode並のIDEになるんじゃないの? - 最強のvimrcを晒す。」 https://qiita.com/ryuta69/items/98901f4c4f0683e7aa57?utm_source=Qiitaニュース&utm_campaign=d26eeec1b5-Qiita_newsletter_356_04_17_2019&utm_medium=email&utm_term=0_e44feaa081-d26eeec1b5-33219769 ↩
「curl コマンドで Qiita API を試す方法」https://qiita.com/itooww/items/ea6f197ef50bf8b252ce ↩