普段はVimで開発しており、様々なプラグインを使っていますが、自作プラグインというものに興味があったので簡単かつミニマムなプラグインを作ってみてVimScriptの基礎を学んでみます。
環境
- macOS High Sierra
- Vim8.2
内容
今回は天気予報APIを使ってその日の天気を教えてくれるプラグインを作ってみます。
ディレクトリ構成
まずvimプラグインのディレクトリは、
- autoload
- plugin
この2つのディレクトリを作ります。
autoload
autoload配下にファイルを作成すると、Vim起動時ではなくコマンド実行時にのみファイルを読むことが可能です。
plugin
plugin配下には実際に呼び出す関数を定義したファイルを作成します。
それぞれのディレクトリに、
show_weather.vim
というファイルを作成します。
.
├── autoload
│ └── show_weather.vim
└── plugin
└── show_weather.vim
関数定義
実際に処理を行う関数を作成します。
function! show_weather#ShowWeather() abort
" ここに処理を書いていく
endfunction
Vimではエラーが発生してもその後の処理も実行されますが、abort
をつけておくとエラー発生時に即関数を抜けることが可能となります。
APIリクエスト
次に天気予報APIにリクエストを送る処理を書いていきます。
APIには無料のopenweathermap
を利用します。
APIの利用には会員登録が必要となります。
https://openweathermap.org/
リクエストにはVimから外部コマンドcurlを叩いてその結果を得ます。
今回は東京の天気を取得します。
APIリクエストにAPIKeyが必要となりますので、vimrcなりに書いて呼び出すようにしておきましょう。
...
let cmd = "curl -s 'http://api.openweathermap.org/data/2.5/weather?units=metric&q=tokyo,jp&APPID=".g:open_weather_appid."'"
let g:open_weather_appid = 'xxxxxxxxx'
g:変数名
でグローバルな変数を定義出来ます。
分岐処理
実行前にcurlコマンドが使えるかの分岐処理を入れておきます。
他の言語同様にif文が使えるのでexist()
の結果で分岐してみます。
外部コマンドはsystem()
を使って実行が可能です。
...
if executable('curl')
let cmd = "curl -s 'http://api.openweathermap.org/data/2.5/weather?units=metric&q=tokyo,jp&APPID=".g:open_weather_appid."'"
let result = json_decode(system(cmd))
endif
Vim8からjson_decode
が使えるようになってので返ってきたjsonデータに実行します。
これでVimの値としてのデータアクセス可能です。
エラー処理
次にレスポンスコードが200以外はエラーを投げるように実装しておきます。
echoerr
を利用することでエラー発生場所を表示できます。
...
if result['cod'] == 200
echo result['weather']
echo result['main']
else
echoerr result
endif
成功時はレスポンスのjsonから天気と気温などを表示するようにしておきました。雑。
最終的に出来上がったのはこんな感じです。
function! show_weather#ShowWeather() abort
if executable('curl')
let cmd = "curl -s 'http://api.openweathermap.org/data/2.5/weather?units=metric&q=tokyo,jp&APPID=".g:open_weather_appid."'"
let result = json_decode(system(cmd))
if result['cod'] == 200
echo result['weather']
echo result['main']
else
echoerr result
endif
else
echoerr 'error! curl not available.'
endif
endfunction
実行コマンド
最後にplugin配下のファイルに実行コマンド書いておきます。
command! ShowWeather call show_weather#ShowWeather()
これでVimから:ShowWeather
を実行すると天気データの入ったデータが表示されるようになりました。
[{'id': 804, 'description': 'overcast clouds', 'icon': '04n', 'main': 'Clouds'}]
{'pressure': 1007, 'temp': 16.3, 'temp_min': 12.78, 'feels_like': 14.93, 'temp_max': 18.33, 'humidity': 79}
まとめ
今回のソースは一応githubにあげておきました。
https://github.com/sakupa802/vim-show-weather
VimScriptの基本は理解出来たので、次回はもっと実用的なレベルのものを公開できればと思ってます。
Vimって素晴らしい。
参考
https://knowledge.sakura.ad.jp/23436/
http://secret-garden.hatenablog.com/entry/2016/10/11/000000