3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-05

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

qiitactlの為に必要な設定

連動のために使用したqiitactlは、環境変数を使ってQiita APIのトークンを読み込むのでVim内部で用意してあげます。

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

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

qiitactl用のコマンドを作る

その前に寄り道

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

vimrc
	" 自作コマンドのローダー
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に関してはその他にやるべきことはほとんどねぇです。

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

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

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で関数ポインタ?的なことが出来るのは便利だなぁと思いました…そもそも関数ポインタなんて始めて知った言葉なんですけど。
何はともあれ関数自体は簡単にできました。ここで苦戦した名残が他の関数に残っております。

じゃあ何にハマったの?

ここまでは殆ど問題なく出来ていたのに、この体たらくで…一体何が起こったのかと言うと…

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

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

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

最終的なスクリプトは…

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!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?