Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ようやく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!

astrorobot110
突然「Vimを使えたらいいなぁ」と思って妙なことを始めた人です https://qiita.com/astrorobot110/items/b341402a4893ed4f8822
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした