Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

ようやく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に関してはその他にやるべきことはほとんどねぇです。

qiitactl.vim
lets:qiitactldir='e:\document\txt\qiitactl'function!s:qiitaFetch() abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl fetch posts')
    echo s:qiitacmd.'...done.'endfunction

command! QiitaFetch calls:qiitaFetch()

"generate post"以外の2つもexpand("%:p")を使ってこの要領で…

qiitactl.vim
function!s:qiitaUpdate() abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl update post '''.expand('%:p').'''')
    echo s:qiitacmd.'...done.'
    edit!endfunctionfunction!s:qiitaCreate() abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl create post '''.expand('%:p').'''')
    echo s:qiitacmd.'...done.'
    edit!endfunction

command! QiitaUpdate calls:qiitaUpdate()
command! QiitaCreate calls:qiitaCreate()

YAML部分の更新があるのでedit!で再読込をします。なんで必要なさそうなlet hoge = system('fuga')しているかは後で…

ファイル生成でハマったわけじゃないのよ…

残るは"generate file"のコマンド化ですが、結論から言うと問題は殆どなかったんですよ…そこ以外でおマヌケなことをしてまして…

qiitactl.vim
function!s:qiitaGenerate(file) abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl generate file "'.a:file.'"')
    exec 'new 's:qiitactldir.'\'.s:qiitacmdendfunction

command!-nargs=1 QiitaGenerate calls:qiitaGenerate(<f-args>)

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

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

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

じゃあ何にハマったの?

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

test.md
<!--
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:qiitactldirlets: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
lets:qiitactldir='e:\document\txt\qiitactl'function!s:qiitaFetch() abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl fetch posts')
    echo s:qiitacmd.'...done.'endfunctionfunction!s:qiitaUpdate() abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl update post '''.expand('%:p').'''')
    echo s:qiitacmd.'...done.'
    edit!endfunctionfunction!s:qiitaGenerate(file) abort
    exec 'cd '.s:qiitactldirlets: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>に置き換えてください。
endfunctionfunction!s:qiitaCreate() abort
    exec 'cd '.s:qiitactldirlets:qiitacmd= system('qiitactl create post '''.expand('%:p').'''')
    echo s:qiitacmd.'...done.'
    edit!endfunction

command! QiitaFetch calls:qiitaFetch()
command! QiitaUpdate calls:qiitaUpdate()
command!-nargs=1 QiitaGenerate calls:qiitaGenerate(<f-args>)
command! QiitaCreate calls:qiitaCreate()

という感じになりました。

さらに調べること

現状s:qiitaGenerate()でわからないことが複数あります。

  • 関数の最初で:cdしてるのにどうしてexec 'new .\'.s:qiitacmdだとファイルが開けないのか?
  • 関数の最後で最終行に移動したいんだけどgotoコマンドで最終行に行けないのか?

が分かっておりません。おしえてVimmer!


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>