ようやくVimの学習結果をメモするためにVimからQiitaに書き込みをする手はずが整いました。
qiitactlの為に必要な設定
連動のために使用したqiitactlは、環境変数を使ってQiita APIのトークンを読み込むのでVim内部で用意してあげます。
" qiitactlの環境変数をVimに追加
let $QIITA_ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
あとはパスが通してあれば:!qiitactl
が出来るようになります。
qiitactl用のコマンドを作る
その前に寄り道
現在のvimrcでは自作コマンドをsource mycommand.vim
として読んでいるので、これから追加する自作のコマンドも全てこれに追記しないとならないことになる…のは流石に嫌だなぁ。とは言えコマンドが増える度にvimrcにsource hoge.vim
するのもカッコ悪い。
というわけで検索したら:runtime
コマンドを使ういい方法があったので書き換えておく。
" 自作コマンドのローダー
runtime! mycommand.d/*.vim
これでvimfiles/mycommand.d/に放り込んでいけば大丈夫になりました
何処までコマンド/引数?
例えば:Qiitactl <args>
とすればqiitactlのコマンドは全てVimから使えるわけだけど、流石にそこまで頑張る必要ないんじゃないかなということで紹介記事で使ってる4つだけに絞ることに。この中でqiitactl側で変数が必要なのは"fetch posts"以外の3つで、そのうちVimからは"Update post"と"create post"はカレントファイルのパスを渡せばいいのでexpand("%:p")
が使えます。このくらいでいいんじゃないかなぁ。
関数じゃないと面倒そう
qiitactlのファイルを取得するコマンドは全て実行したパスにファイルをコピーするので、"fetch post"に関してはディレクトリを移動する必要があります。まぁ何かと移動する必要があると思うので変数で管理しておきましょう。fetchに関してはその他にやるべきことはほとんどねぇです。
let s:qiitactldir = 'e:\document\txt\qiitactl'
function! s:qiitaFetch() abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl fetch posts')
echo s:qiitacmd.'...done.'
endfunction
command! QiitaFetch call s:qiitaFetch()
"generate post"以外の2つもexpand("%:p")
を使ってこの要領で…
function! s:qiitaUpdate() abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl update post '''.expand('%:p').'''')
echo s:qiitacmd.'...done.'
edit!
endfunction
function! s:qiitaCreate() abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl create post '''.expand('%:p').'''')
echo s:qiitacmd.'...done.'
edit!
endfunction
command! QiitaUpdate call s:qiitaUpdate()
command! QiitaCreate call s:qiitaCreate()
YAML部分の更新があるのでedit!
で再読込をします。なんで必要なさそうなlet hoge = system('fuga')
しているかは後で…
ファイル生成でハマったわけじゃないのよ…
残るは"generate file"のコマンド化ですが、結論から言うと問題は殆どなかったんですよ…そこ以外でおマヌケなことをしてまして…
function! s:qiitaGenerate(file) abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl generate file "'.a:file.'"')
exec 'new 's:qiitactldir.'\'.s:qiitacmd
endfunction
command! -nargs=1 QiitaGenerate call s:qiitaGenerate(<f-args>)
他の関数から増えたことは…
- 引数を取った
- コマンドが生成したファイルのパス返すのでそれを開くアクションに回せる
調べながら関数書いててlet
で関数ポインタ?的なことが出来るのは便利だなぁと思いました…そもそも関数ポインタなんて始めて知った言葉なんですけど。
何はともあれ関数自体は簡単にできました。ここで苦戦した名残が他の関数に残っております。
じゃあ何にハマったの?
ここまでは殆ど問題なく出来ていたのに、この体たらくで…一体何が起こったのかと言うと…
<!--
id: ""
url: ""
created_at: 2018-05-05T19:18:16+09:00
updated_at: 2018-05-05T19:18:16+09:00
private: false
coediting: false
tags: []
team: null
-->
# test
テスト投稿です
ということをしてたのですが…タグを書いていないんです。
Qiitaの仕様上、タグは必ず必要ということを理解していなかったので、「とりあえずこれで投稿できればいいや」と思ってテストしたのが大失敗で、これだけで2日、ついでにこのタグの部分の書式がものすごく厳密だということに気がつくのも遅く、更新しているこの間にもハマるという有様です。またやらかすと枕を濡らす日々が続くので対処しておきます。当面Vimの話しか書かんので…
function! s:qiitaGenerate(file) abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl generate file "'.a:file.'"')
exec 'new 's:qiitactldir.'\'.s:qiitacmd
%s/\v%(tags:)@<=\s+\[\]/^M- Vim:^M - "8.0"/g " 正規表現中の^Mは<C-v><CR>に置き換えてください。
endfunction
この正規表現のチェックでも何度もやらかしてて正規表現苦手だなーと思いました。
最終的なスクリプトは…
let s:qiitactldir = 'e:\document\txt\qiitactl'
function! s:qiitaFetch() abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl fetch posts')
echo s:qiitacmd.'...done.'
endfunction
function! s:qiitaUpdate() abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl update post '''.expand('%:p').'''')
echo s:qiitacmd.'...done.'
edit!
endfunction
function! s:qiitaGenerate(file) abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl generate file "'.a:file.'"')
exec 'new 's:qiitactldir.'\'.s:qiitacmd
%s/\v%(tags:)@<=\s+\[\]/^M- Vim:^M - "8.0"/g " 正規表現中の^Mは<C-v><CR>に置き換えてください。
endfunction
function! s:qiitaCreate() abort
exec 'cd '.s:qiitactldir
let s:qiitacmd = system('qiitactl create post '''.expand('%:p').'''')
echo s:qiitacmd.'...done.'
edit!
endfunction
command! QiitaFetch call s:qiitaFetch()
command! QiitaUpdate call s:qiitaUpdate()
command! -nargs=1 QiitaGenerate call s:qiitaGenerate(<f-args>)
command! QiitaCreate call s:qiitaCreate()
という感じになりました。
さらに調べること
現状s:qiitaGenerate()
でわからないことが複数あります。
- 関数の最初で
:cd
してるのにどうしてexec 'new .\'.s:qiitacmd
だとファイルが開けないのか? - 関数の最後で最終行に移動したいんだけど
goto
コマンドで最終行に行けないのか?
が分かっておりません。おしえてVimmer!