スタートライン - Vimとqiitactlを連動する

ようやくVimの学習結果をメモするためにVimからQiitaに書き込みをする手はずが整いました。

## qiitactlの為に必要な設定

連動のために使用した[qiitactl](https://github.com/minodisk/qiitactl/releases/tag/v0.1.4)は、環境変数を使ってQiita APIのトークンを読み込むのでVim内部で用意してあげます。

```vim:vimrc
	" qiitactlの環境変数をVimに追加
let $QIITA_ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

あとはパスが通してあれば`:!qiitactl`が出来るようになります。

## qiitactl用のコマンドを作る

### その前に寄り道

現在のvimrcでは自作コマンドを`source mycommand.vim`として読んでいるので、これから追加する自作のコマンドも全てこれに追記しないとならないことになる…のは流石に嫌だなぁ。とは言えコマンドが増える度にvimrcに`source hoge.vim`するのもカッコ悪い。
というわけで検索したら`:runtime`コマンドを使ういい方法があったので書き換えておく。

```vim:vimrc
	" 自作コマンドのローダー
runtime! mycommand.d/*.vim
```

これでvimfiles/mycommand.d/に放り込んでいけば大丈夫になりました

### 何処までコマンド/引数？

例えば`:Qiitactl <args>`とすればqiitactlのコマンドは全てVimから使えるわけだけど、流石にそこまで頑張る必要ないんじゃないかなということで[紹介記事](https://qiita.com/minodisk/items/74a02c564b88a6632f40)で使ってる4つだけに絞ることに。この中でqiitactl側で変数が必要なのは"fetch posts"以外の3つで、そのうちVimからは"Update post"と"create post"はカレントファイルのパスを渡せばいいので`expand("%:p")`が使えます。このくらいでいいんじゃないかなぁ。

### 関数じゃないと面倒そう

qiitactlのファイルを取得するコマンドは全て実行したパスにファイルをコピーするので、"fetch post"に関してはディレクトリを移動する必要があります。まぁ何かと移動する必要があると思うので変数で管理しておきましょう。fetchに関してはその他にやるべきことはほとんどねぇです。

```vim:qiitactl.vim
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")`を使ってこの要領で…

```vim:qiitactl.vim
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"のコマンド化ですが、結論から言うと問題は殆どなかったんですよ…そこ以外でおマヌケなことをしてまして…

```vim:qiitactl.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
endfunction

command! -nargs=1 QiitaGenerate call s:qiitaGenerate(<f-args>)
```

他の関数から増えたことは…

- 引数を取った
- コマンドが生成したファイルのパス返すのでそれを開くアクションに回せる

調べながら関数書いてて`let`で関数ポインタ？的なことが出来るのは便利だなぁと思いました…そもそも関数ポインタなんて始めて知った言葉なんですけど。
何はともあれ関数自体は簡単にできました。ここで苦戦した名残が他の関数に残っております。

### じゃあ何にハマったの？

ここまでは殆ど問題なく出来ていたのに、[この体たらく](https://qiita.com/astrorobot110/items/35c21751ef74a267496f)で…一体何が起こったのかと言うと…

```
<!--
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の話しか書かんので…

```vim:qiitactl.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
```

この正規表現のチェックでも何度もやらかしてて正規表現苦手だなーと思いました。

## 最終的なスクリプトは…

```vim:qiitactl.vim
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！