イカリングを閲覧できる ikaring.vim を作った

Splatoon してますか? 本日また大きめのアップデートが入って、まだまだ熱は冷めそうにないですね。
さて、この Splatoon 専用の SNS として、イカリングというサービスがあります。

イカリング: https://splatoon.nintendo.net/

フレンドのオンライン状態を確認できたり、フレンド内での週間ランキングが閲覧できたり、自分やフレンドの装備や各ブキの塗り面積が確認できたり、ステージのスケジュールを知ることができて、とても便利です。
とても便利なのでいつでも見れると嬉しいですね。
というわけで Vim から見れるようにしました。

https://github.com/thinca/vim-ikaring

使い方

:Ikaring コマンドを実行すると開始できます。
初回は、Nintendo Network ID とパスワードを訊かれるので入力します。
ログイン後はクッキーをローカルに保存するので、セッションが切れるまでは再度入力する必要はありません。
もしくは以下のように変数を設定しておけば自動的に接続します。

let g:ikaring#username = 'thinca'
let g:ikaring#password = '******'

開くと以下のような画面になります。

…これはたまたま誰も遊んでないだけであって、フレンドがいないわけじゃないんだからね!
というわけでランキング画面を開いてみます。

:Ikaring ranking

ちゃんとフレンドいますね。
ナワバリバトルのポイントが0になってますが、これは単に勝率が0%なだけです。バグではないです。
次にプロフィール画面を開いてみます。

:Ikaring profile

出ましたね。ブキをとっかえひっかえしているせいでウデマエが全然上がりません。
一番下を見ると、塗りの合計も見れます。

ちなみに、フレンド画面やランキング画面でユーザー名の上で を押したり、:Ikaring profile [ユーザー名] (補完あり) を実行すると、フレンドのプロフィールが見れたりします。

最後にステージ情報です。

わかりやすい。

苦労した点について

実はこのプラグイン、8月上旬に作り始めて、早い段階で8割方できてたんですが、エラー処理とかその他細かい部分のブラッシュアップをしようと思ってたらこんな時期になってしまいました…反省…。
さて、ここからは作る上で苦労した点について書いていきます。

ログイン

当然ですが、イカリングには API なんてものはありません*1
じゃあどうするかというと、スクレイピングになります。
最初に試しに Ruby で Mechanize を使ってやってみたところ、当然のようにログインしてログイン後のページのデータが取れました。便利。
しかし、今回作るのは Vim プラグインなので、Vim でやりたいわけです。Ruby に頼るわけにはいかない。
というわけで、スクレイピングするようなライブラリを、今回やりたいことができる最低限の機能で作りました。
まだリリースしてませんが、vital.vim のライブラリとして作ってあります。ikaring.vim に含まれているので、気になる人は見てみてください。
この件についてはリリースも含めて後日また書きます(たぶん)。

ギアの名前

イカリングですが、ブキやギアは基本的に画像でしか表示されていません。名前のリソースが一切ないのです。
画像の方はどうやらブキやギアに対してハッシュ値の ID が振られていて、URL にはこの ID が使われているようです。
なので、ID とブキ/ギアの対応さえわかれば、表示できます。しかし、この ID を知るには、イカリング上で各ギアを表示する必要があるのです…。
ブキに関しては、実はフレンドにバトルの予定を知らせる機能の部分に一覧がありました。そもそもブキは入手も簡単なので ID を知るのは難しくないです。
ギアに関しては、1つずつ調べていくしかありません。ギアの ID を知るには、ギアをイカリング上に表示する必要があり、つまり自分もしくはフレンドの誰かが該当ギアを装備していなくてはいけません。
なので私は、ゲーム上で入手可能なほぼ全てのギア*2を入手し、装備してバトルを行い、数分後にイカリングに反映されているのを見ては ID をチェックする、という作業を繰り返して、ほぼ全てのギアの ID を調べることに成功しました!やった!!!
…と思ったら、そのうち来るとは思っていたけど、本日、無事アップデートで新ギアが追加されました。本当にありがとうございました。
もう私一人で全て調べるのは無理です*3
もしあなたが ikaring.vim を使っていて、本来ギアが表示されるはずの部分にハッシュ値が表示されたら、ぜひその ID とギアの名前を以下の Issue にコメントして教えてください。フレンドの持ってる名前の知らないギアの場合などもあると思いますが、しばらくすれば攻略 Wiki なんかで画像付きで名前が調べられると思うので、そちらも合わせてご確認頂けると助かります。ご協力をお願いします!

https://github.com/thinca/vim-ikaring/issues/1




と言うわけで ikaring.vim を作った話でした。イカよろしく〜

*1:一部の情報はログイン後なら JSON で取得できたので、そこは楽でした

*2:まだランク50になってないのででんせつのぼうしだけ持ってない

*3:もしくはとても時間がかかります。コンプガチャつらい

Vim script で AtCoder に参戦する方法

先週、進捗キャンプという知り合いで集まって進捗を出す会に行ってきて、そこで @ さんと表題の件について色々話した。
その後個人的に手法をカイゼンしたりしたので、結果をまとめておく。

AtCoder とは

http://atcoder.jp/
私自身も「とは」と言って語れるほど詳しくはないので簡単に説明すると、主に日本人向けの競技プログラミングサイト。
問題は全て日本語で、定期的に様々なコンテストが開催されている。問題の難易度が低い初心者向けのコンテスト(AtCoder Beginner Contest 通称 ABC)なんかもあるので、競技プログラミングの入口としては最適だ。

AtCoder の対応言語

競技プログラミングでは、ソースコードを提出し、提出されたコードが正しく動くかどうかサーバ側で実際に動かして検証を行う。つまり、サーバ側に各言語の処理系が必要であり、競技プログラミングで使用できる言語はその点で制約がかかる。
どの言語が使えるかは競技プログラミングによって様々であるが、AtCoder はかなり多くの言語に対応している。
しかし、Vim script は対応言語には含まれていない。
それもそのはず。Vim script は言語としてマイナーという点を除いても、とある問題がある。

競技プログラミングの問題形式と Vim script

競技プログラミングにおける問題は、多くの場合、標準入力と標準出力を使う。
標準入力から問題のデータを受け取り、問題を解いて、結果を標準出力に出力させる。
AtCoder も例に漏れずこの形式である。
標準入出力は多くの言語が標準で扱えるので、この形式にすることで多くの言語に対応することができるためだと思われる。
しかし、Vim script はテキストエディタ Vim を拡張するための言語。標準入出力を直接扱うことは、できない。

ではどうするか

AtCoder の対応言語の1つに、Bash がある。
Bash は、それ自身にもそれなりの演算能力はあるが、どちらかと言うと外部プログラムを呼び出す能力に長けている。
実際、awk や bc なんかがよく使われたりするらしい(よく知らないけど)。
つまり、この Bash の環境に Vim が入っていれば、あとは標準入出力を Bash 側で面倒を見ることによって、Vim script が使えることになる。
試したところ Vim はちゃんと入っているようだった*1。これで Vim script で問題が解ける。

Vim script で問題を解く

AtCoder には練習用のコンテストがあるので、そこにある練習問題を解いてみる。
http://practice.contest.atcoder.jp/tasks/practice_1

vim -u NONE -i NONE -N -n -e -s -S <(cat <<EOF
function! s:main(input) abort
  let a = a:input[0]
  let [b, c] = split(a:input[1], ' ')
  let s = a:input[2]
  return (a + b + c) . ' ' . s
endfunction

let s:input = getline(1, '$')
enew
put =s:main(s:input)
1 delete _
%print
EOF
) <(cat)

結果はこちら
ちゃんと解けてる。

何をしているのか

まず、このコード自体は Bash であるが、事実上その大部分は Vim script である。
ちょっとずつ分解していくと、まず vim を起動するコードは Vim script の部分を省略すると以下のようになる(... の部分が省略部分)。

vim -u NONE -i NONE -N -n -e -s -S <(...) <(cat)
  • -u NONE
    • vimrc ファイルを読み込まない。
  • -i NONE
    • vininfo ファイルを作成しない。
  • -N
    • vi 互換モードをOFFにして(つまりVimとして)起動する。
  • -n
  • -e -s
    • バッチモードで起動する。詳細は割愛。(気になる人は :help -s-ex を参照)
  • -S {ファイル}
    • 起動後にファイルを Vim script として実行する。
  • <(cat)
    • Vim で開くファイルの指定。<(...) はプロセス置換という bash の機能で、コマンドの結果をファイルとして渡すことができる。

さて、Vim を起動していることはわかったので、次は Vim script 部分。

function! s:main(input) abort
  let a = a:input[0]
  let [b, c] = split(a:input[1], ' ')
  let s = a:input[2]
  return (a + b + c) . ' ' . s
endfunction

let s:input = getline(1, '$')
enew
put =s:main(s:input)
1 delete _
%print

ちょっとずつ見ていく。

function! s:main(input) abort
  let a = a:input[0]
  let [b, c] = split(a:input[1], ' ')
  let s = a:input[2]
  return (a + b + c) . ' ' . s
endfunction

わかりやすくするため、問題を解く部分を関数に分けた。
引数の input は、入力のテキストが行単位で配列で渡ってくる。
結果を文字列か、行単位の配列で返す。

let s:input = getline(1, '$')

入力はファイルとして渡ってきており、バッファに開かれている。
バッファの全行を配列として s:input に保存している。

enew

output 用の新しいバッファを開く。

put =s:main(s:input)
1 delete _

結果をバッファに展開している。
空のバッファに put でテキストを置くと1行目に空行が残ってしまうので、delete でこの余計な空行を消している。

%print

バッチモードの Vim では、print などのいくつかのコマンドの結果は標準出力へ出される。
%print でバッファ全体を標準出力へ結果として出力している。
ちなみにこの方法だと、最後に改行のない出力が行えない*2が、大抵の競技プログラミングの問題は最後に改行を出力させるので、問題になることはないだろう。

解く環境を整える

テンプレート

こうして見るとわかる通り、実際に触るのは s:main() 関数の部分だけであり、他の部分はテンプレートだ。
テンプレート系のプラグインを使って、テンプレート化しておくと便利だろう。
ちなみに私は template.vim を使っている(宣伝)。

Vim script 部分だけ編集する

ファイル全体としては Bash だけど、編集したいのは Vim script だ。main の部分だけを、filetype=vim で編集したい。
そんな時に便利なのが partedit.vim だ。
バッファの一部を別のバッファで開き、別のファイルタイプで編集できる。保存すると元のバッファに適用される。

https://i.gyazo.com/14a70ff2a7148b9e1507170bda083710.gif

上の動作例では :Partedit コマンドを引数なしで動かしているが、そうするためにはオプションの設定が必要だ。

" 部分を編集するバッファを開くコマンドの指定。これは縦分割したい場合の例 (デフォルトだと現在のウィンドウにそのまま開かれる)
let g:partedit#opener = 'vsplit'
" 部分を編集するバッファの filetype。デフォルトだと元のバッファと同じ filetype が適用される。
let g:partedit#filetype = 'vim'

ファイルタイプは常に同じだと別のシーンで使いたい場合に困ると思うので、localrc.vim などを利用して、b:partedit_filetype を設定するといいだろう。

テストケースを実行したい その1

答えが正しいか、提出する前に手元で実行して確認したいだろう。
開いているファイルを実行したい、と来れば、quickrun.vim が便利だ。
問題の入力を標準入力で与える必要があるが、幸い quickrun.vim は標準入力にも対応している。input オプションを設定すればよい。

" input.txt ファイルの中身を標準入力として使う
QuickRun -input input.txt

" = で始めることでファイルではなく入力文字列を直接与えられる
QuickRun -input =input-text
" i レジスタの中身を標準入力として使う
QuickRun -input =@i
" b:input 変数の中身を標準入力として使う
QuickRun -input =%{b:input}

" 事前に設定しておけば毎回指定する必要はない
let g:quickrun_config = {'_': {}}
let g:quickrun_config._.input = '=@i'
let g:quickrun_config._.input = '=%{b:input}'

" 実行する際に変数に値を入れれば OK
let b:input = "1\n2 3\ntest\n"

print デバッグするには、put コマンドを使えばよい。
最終的なバッファの内容が出力結果になるので、put コマンドでバッファに行を足してやる。

let hoge = 'debug'
put =hoge
" put の中では " はコメント扱いになり使えないので注意
put ="foo"  これはコメントになるので動かない
put =\"foo\"  " これなら動く
テストケースを実行したい その2

実は、もっと楽な方法がある。ここで s:main() を切り分けておいたのが役に立つ。
単純に s:main() を呼んでしまえば良い。

function! s:main(input) abort
  let a = a:input[0]
  let [b, c] = split(a:input[1], ' ')
  let s = a:input[2]
  return (a + b + c) . ' ' . s
endfunction

echo s:main(['1', '2 3', 'test'])

これで OK だ。ただし、この状態で Bash としてこれを実行しても結果を見ることはできない。
しかし先ほどの partedit.vim で、このバッファは Vim script として独立している。そう。quickrun.vim を使えばよい。このバッファはファイルとして存在していないが、quickrun.vim であれば実行可能だ。

こちらの方法で print デバッグしたい場合は、echo コマンドを使えば OK だ。わかりやすい。

ちなみにこれらの echo の行は、Bash としての実行結果には一切影響を及ぼさないので、そのまま投稿することも可能だが、当然実行時間は長くなってしまうので注意が必要だ。

最後に

Vim script で AtCoder に参加する方法について紹介した。
今回の例では出てこなかったが、当然 main 以外の関数を定義することもできる。
また、よくある操作については vital.vim のコードが参考になる。Data.ListData.StringMath 辺りには便利関数が揃っている。NYSL なので、コピペして使ってもまったく問題ない。是非活用して欲しい。
Enjoy Programming!

*1:軽く調べてみたところ、練習用コンテストの Vim のバージョンは 7.3.429 だった。Ubuntu 12.04 の Vim がこのバージョンなので、この環境を使っている可能性が高い。コンテストによっては環境が異なる可能性があるので注意。

*2:一応別の方法で回避はできる。

Yokohama.vim.reboot #6 に行ってきた

Yokohama.vim.reboot #6 に行ってきた!
最近は勉強会自体あまり行けてなくて、それなのに行っても感想記事サボっているので反省…。久々に書く。

アイスブレイク

Vim に関するキーワードが書かれたカードを、自分には見えない(というより見ない)ように、他の人には見えるように首から下げる。
そしてペアを組んで、軽く自己紹介したあと、互いに自分のカードに書かれた内容について、はいかいいえで答えられる質問をしてって、自分の持ってるカードに書かれたキーワードを当てる、というゲームをした。ペアは適当な時間毎に組替える。
これが意外にむずくて、なかなか当てられない…。キーワードは初心者向けと上級者向けに分かれていたので、私は空気を読んで上級者向けのを取ったのだけど、上級者向けのワードはそもそも初心者の人に質問しても相手がその単語についてよくわかっていなくて曖昧な答えが返ってきたりして、そうなることも計算に入れつつ質問を考えて答えを探すのがめっちゃむずかしかったけど楽しかった。
かなり盛り上がって、予定の時間より長くなったけどめっちゃ良かった。ちなみに私のキーワードは view でした。view コマンド使わないなぁ…。

KazuakiM さんの発表

Vim を使うようになった軌跡みたいなお話。Vim にデレていく話はいい話ですね。
ちなみにサクラエディタを使ってたという話だったけど、私も以前はサクラエディタ使ってました。よさ。

vimrcソースリーディング

各テーブルに分かれて vimrc 読んだりなんだりした。
他のテーブルがどういう感じだったのかは知らないのだけど、私のところのテーブルは3人で、私以外の二人の vimrc を順番に読んでいって改善ポイントとか探したり、改善のための編集操作で、こうした方がいいよ、とかこういう方法があるよ、みたいなアドバイスをしていくみたいな偉そうなアレをしてました。マンボウさん偉そう。
ガッツリ読んで改善して、みたいなことをしていたので、予定のタイムテーブルにあった、スクラッチからの vimrc 構築は結局やらなかった…。希望者が少なかったのもあるけど、スクラッチからはやはりなかなか難しい感じがある。

懇親会

ビアバッシュで、寿司とかナン+カレーとかチキンとか食べつつおしゃべりも少ししつつ割ともくもくと食べてた。
食べ終わって、勢いでやるって言ってあったライブコーディングをすることになったんだけど、ネタは考えてなくもなかったんだけど正直みんなに楽しんで貰えるネタか自信がなくてその場でみんなにネタ聞いたりしてやった。
その結果、とあるsyntax定義プラグインが微妙なので直すのをやって欲しい、みたいな話があって始めたのだけど、なぜか Vim がエラー出しまくって、調査をした結果 Vim のバグっぽいということがわかり、そのIssueを登録するということをして、当初の目的は忘れられてライブVimデバッギングになってしまった…すまぬ…。
これはこれで滅多に見られないもの見せられたしよかったかな感はあるけど、所詮結果論だし、グダってしまったのは本当に申し分けない。その場でお題を募集なんてすると下調べもないもんだからどうやってもグダるし、やはりやるときはちゃんと自分でお題を用意しとこうって思った。次に活かしたい。

まとめ

次回も行きます!

OmniSharp.vim のメンテナになりました

http://i.gyazo.com/648e0bbd21949a25313e8ab983e4df04.png
https://github.com/OmniSharp/omnisharp-vim
顔アイコンの中にマンボウアイコンを潜り込ませることに成功しました。壮観ですね。
問題の報告や機能要望などは私に直接言ってもらっても大丈夫です。日本語でOK。サーバ絡みだと対応は難しいかもしれないですが、善処します。
GitHub の Issue の方は世界中の人が見ているので、あちらに書く場合は英語でお願いします。

Google の Vim script Guide について言っておきたいこと

この記事は Vim Advent Calendar 2014 の 25 日目の記事です。

Google が、様々な言語に対する自社内でのスタイルガイドを公開しているのはご存知でしょうか。C++ のものJavaScript のものなどがあり、この辺りは割と有名かと思います。
では、Vim script のものがあるのはご存知でしょうか?
Google は、Vim script について、2 つのガイドを公開しています。

前者がカジュアルユーザー向け、後者がヘビーユーザー向け、といった位置付けのようです。さすが、Google がまとめているだけあって、なかなかポイントを抑えています。
ただ、これはあくまで Google が社内向けに作ったもの。鵜呑みにしてはいけない、もしくは、一般の人が使う場合は参考にしない方がいい部分もちらほら見受けられます。
そこでこの記事では、この 2 つのスタイルガイドを見るにあたって注意すべき点をまとめようと思います。全て個人の見解です。引用に入っている訳は、私による勝手訳です。

全体について

maktaba が前提になっている

Google が公開している、maktaba と言う Vim プラグイン向けのプラグインライブラリがあります。
これらのガイドでは、事あるごとに、Vim のこの機能は使わないで代わりに maktaba のこれを使え、のように指示してきます。
しかし、誤解を恐れずに言うと、maktaba はその仕組み上使うべきではありません。
ざっくり簡単に理由を言うと、maktaba は $ から移すことができない jQuery のようなものであり、別の言い方をすると、URL にバージョンが含まれていない Web API のようなものです。今後互換性のない変更が入った瞬間に死亡する未来がありますし、今でも、maktaba のバグに依存した動作をするプラグインはバグが修正されると死にます。
と言うわけで、maktaba 云々と書かれている部分は華麗にスルーするのが良いです。

Google Vimscript Style Guide

Regular Expressions

Prefix all regexes with \m\C.

全ての正規表現は \m\C で始めること。

\m は 'magic' がオンの状態で正規表現の解釈を行い、\C はパターン全体を大文字小文字を区別するようにします。
これは確かに誤爆を防ぐのには役に立ちますが、毎回指定するのはやや冗長です。
正規表現を受け取る Vim script の関数のうち、'magic' オプションが適用されるのは search() と searchpos() くらいです。
よく使う =~# も 'magic' の影響は受けません。
'ignorecase' オプションの影響を受けるのは、match()、matchend()、matchlist()、matchstr()、search()、searchpos()、searchpair()、searchpairpos()、substitute() になります。多いようですが、match() とその派生、search() とその派生、substitute() なので、系統としては 3 つくらいです。
この辺りはざっと調べたものなので、足りなかったり違っていたら教えてもらえると助かります。
自信がなければ \m や \C を付けておくのは悪いことではないですが、必須にするほどでもないかな、と思います。

Type checking

Use strict and explicit checks where possible.

可能ならば厳密かつ明示的な型チェックをしなさい。

is# などを使え、というのはその通りですが、全ての変数を使う前に型をチェックするのは冗長になりすぎます。
例えば Ruby を書いていて、全ての関数で、その引数について型のチェックをするコードを書くでしょうか? 書きませんよね。
期待した型でなければ、大体の場合は例外が飛ぶので、きちんと例外を処理すれば問題はないでしょう。たまに運悪く期待しない状態のまま先に進んでしまうこともありますが、その時はその時です。

Python / Other Languages

Python
Use sparingly.
Use python only when it provides critical functionality, for example when writing threaded code.
Other Languages
Use vimscript instead.
Avoid using other scripting languages such as ruby and lua. We can not guarantee that the end user's vim has been compiled with support for non-vimscript languages.

Python は慎重に使いなさい。他の言語は使ってはいけません。

はい。Google なのでお察し、といったところでしょうか。Python だけ許可して他を許可しない理由が全く説明されていません。
個人的な見解を述べるならば、外部インターフェースは余程の必然性がない限りは使うべきではありません。理由は Google が説明している通りで、ユーザーの Vim で使えるとは限らないからです。これは当然 Python にも言えることです。
ただ、あなたが書く Vim script があくまで自分向けのものであれば、書き易いように外部インターフェースを使うことは選択肢となりえるでしょう。他言語であればすでに揃っているライブラリを Vim script でわざわざ書き直すような真似は、一部の変態さんたちに任せて、あなたは使いなれた言語で使いなれたライブラリを使えばよいのです。
…私は変態さんなのでもう手遅れです。

Commands

In the plugin/commands.vim or under the ftplugin/ directory, defined without [!].

plugin/commands.vim か ftplugin/ ディレクトリに、[!] を付けずに定義します。

plugin/commands.vim に、と書いてますが、絶対にやってはいけません。
最近でこそ Vim プラグインプラグインマネージャでインストールして、runtimepath を追加していく方式が流行っていますが、本来は Vim プラグインは 1 つのユーザディレクトリにまとめていれていくもので、そのような運用も可能になっているべきです。
みんながみんな plugin/commands.vim にコードを書いたら、当然ファイル名が衝突します。
ちなみにどうやらこのファイル名のルールは maktaba によるもののようです。
[!] については、適切なコマンド名を付けていれば、ユーザの定義を上書きすることはほとんどないかとは思いますが、ここはどちらでも良いと思います。

Autocommands

Place them in plugin/autocmds.vim, within augroups.

plugin/autocmds.vim に、augroup 付きで定義しなさい。

Commands と同じファイル名の問題。

Mappings

Place them in plugin/mappings.vim, using maktaba#plugin#MapPrefix to get a prefix.

plugin/mappings.vim に、maktaba#plugin#MapPrefix を使って定義しなさい。

Commands と(ry
maktaba(ry

Naming

Prefix all variables with their scope.

全ての変数にはスコープのプレフィックスを付けなさい。

l: については無理に付ける必要はないと思いますが、一部の変数名が v: と衝突する可能性があるので、付けた方が安全ではあります。
私は省略する派です。

Google Vimscript Guide

こちらはヘビーユーザ向けということで、Style Guide の方の内容も含まれています。重複していない部分について言及します。

Structure

ここに書かれているものの多くは maktaba 前提の構成のようです。

Documentation

Use vimdoc.

vimdoc を使いなさい。

この vimdoc というツールは、私もあまり詳しくないのですが、軽く調べてみた限りだと maktaba の構成に依存しているようです。
あとは変則的な help に対応しているのかがちょっとわかりませんでした。




と言うわけで、個人的に問題があると思う点を挙げてみました。
結構色々書きましたが、最初に言った通りポイントは抑えられていて、maktaba に絡まない部分はかなり参考になります。つまり諸悪の根源は maktaba…。


これで今年の Vim Advent Calendar は終わりです。でも、皆さんの Vim ライフは始まったばかりです。それではまたいつの日か、未来でお会いしましょう!

VimConf 2014 を開催しました

去る 2014年11月8日、VimConf 2014 を開催しました。
私は、主催、というわけでもないのだけど、本会開催スタッフの中心人物的な感じで関わらせていただきました。
VimConf は本当に多くの人の協力で成り立っています。私は今回、あちこちの人に色々お願いして回るのがメインで、みなさんの協力があって初めて開催することができました。
ボランティアスタッフとして手を挙げ、手伝ってくれた皆さん、発表者の皆さん、そして参加してくれた皆さん。本当にありがとうございました!




とまあ、固い話はこれくらいにして、以下、いつも通り雑に感想書いていくよ!

Identity of the Vim - @

資料: http://koron.github.io/vimconf-2014-koron/
Vim を使うなら色々やろう!と言う話。さすが kaoriya さん、いい話すぎて、最初から感極まりまくりました。
確かに、私もあちこち手を出す習性がある。しかし最近新しいことに手を出せてなくて、いかんなーと思っていたところ。なんとかしたいー。

PM2 - @

資料: https://docs.google.com/presentation/d/1u5A7F3Kd4XwJlIUQZAVmrwWfLcoLf9NURtqAEafi_oo/edit#slide=id.p
vital.vim の ProcessManager version 2 の紹介。
PM2 の正式名、懇親会で決めようと言ってた気がするけど結局決まってない気がする。
あと合法電子ドラッグの Civ5 の紹介もあった。開発が滞っているのはこいつのせいらしい。

f - @

資料: https://speakerdeck.com/rhysd/vimconf-2014-f
f を拡張するプラグインの数々をどどんと紹介。
オチが秀逸だった。便利すぎる。

Hey, Java! Vim is coming. - @

資料: https://docs.google.com/presentation/d/1zaPy82NJ6A3Iw1llKqU-lX88AJNt1EKy5O15nOp085c/edit#slide=id.p
VimJava を書くよって話。
幸いにも最近 Java を書く機会はないのだけど、必要になったら色々参考にさせて頂きたい…!

auto closing parenthesis - @

資料: http://www.slideshare.net/cohama/auto-closing-parenthesis-vim-conf2014-41290298
dot repeatable な便利自動閉括弧入力について。
lexima.vim、便利で私も最近使い始めました。閉括弧は私はやってないのだけど、endwise 的な設定がとても便利。
undo の問題も解決するといいなぁ。さっきコード読んでみたけど難しかったのでまた今度見てみる。

怖くないマクロ入門 - @

資料: http://www.slideshare.net/deris0126/vimconf4
初心者向けのマクロ入門。
実演が欲しかった感がある。けどまあ時間的に厳しかったのかな。
マクロはコツを掴むと割と適用できるタイミングあるので、覚えると便利。

Test for Vim script - @

資料: https://gist.github.com/thinca/2cf4ae0df88a99423c9d
私の発表。準備が遅れた結果、事前に全く練習ができず、時間配分とかすごい適当になってしまったけど、適当なりになんとかなった感じはある。…良くはない。
元々、デモで紹介したい themis.vim の機能はいくらでもあったので、残り時間見つつデモで調整する予定だったのだけど、あんまり見せられなかったです。.vimspec はできれば見せたかった。

Let's talk about neovim - @

資料: http://www.slideshare.net/Shougo/lets-talk-about-neovim
neovim に関する topic や、OSS の fork についての話。
neovim は私はほとんど情報を追っていなかったので、ハイライトを知るいい機会でした。
neovim 一度くらいは触ってみた方がいいのかなぁと思いつつ、面倒で触る気が起きない…うう…。

かなりすごい発表(かなり) - @

資料: http://www.slideshare.net/supermomonga/super-cool-presentation-at-vimconf2014
かなりすごかった。(かなり)
ThingsPast.vim かなり前から知ってはいるのだけど、未だに試せていないので今度試す。

XVim with MacVim and smartgrep - @

資料: http://www.slideshare.net/pebble8888/using-xvim-with-macvim
XVim も MacVim も使いたいので、両者を行き来する方法について。
Mac 使ってない勢なので、ふふーん、なるほどね。という感じで聞いてました。
と、チラっと smartgrep の紹介。コメント部分を除外してくれる grep らしい。

/-improved - @

資料: https://docs.google.com/presentation/d/1ie2VCSt9onXmoY3v_zxJdMjYJSbAelVR-QExdUQK-Tw/pub?start=false&loop=false&delayms=3000&slide=id.g4e7add63c_05
検索を高度に使いこなすワザ。私も活用できていないので、もっと活用していきたい…!
上級の光の Vimmer の動きを見ると、ナチュラルにカーソル移動に検索を使っていて、私もやっていきたい気持ちがある。
gn は便利すぎるのでみんな使っていきましょう。

vim script初心者に使ってもらいたい、転ばぬ先の杖「Vint」 - @

資料: https://speakerdeck.com/orgachem/zhuan-banuxian-falsezhang-vint
Vint、発表を見て早速入れてみました。速いらしいし、設定も柔軟らしいし、とても便利そう。
…なのだけど、私の環境で vimrc をチェックしたら Vint 自体がエラーで死んでしまった。後で報告して修正に協力したい所存です。

Jenkins + vimenv で 最新のVimを使おう! - @

資料: http://www.slideshare.net/raa0121/jenkinsvimenv-vim-vimconf2014
常に最新の Vim が使えて、過去の Vim もいつでも使える環境を整える話。
シェルのコマンドを使って欲しい情報(今回の場合はVimのバージョン)をどうやって取得するかと言うあたりがメインだった。
ちなみに、ビルド済みの Vim を全部取っておくとかなり容量を食うらしいので注意。

懇親会

大量のピザと寿司で懇親会。寿司は大変に良さがあった。
なるべく色んな人とお話しようと、それなりに回ってみたつもりではあったけど、やっぱりそんなに多くの人とはお話できず…。
最後の方で、Vim script テクニックバイブルの来場者プレゼントをしました。Vim のバッファに名前を書いていってもらい、vital.vim の Random モジュールで3名の当選者を一気に出すという方式。結果、@ さんと、@ さんと、@ さんに当たりました。あと一人はどなただったか失念…k_takata さんに教えてもらいました!*1。おめでとうございます!



まとめ: 感極まった。

*1:当選者メモっておくべきだった。失敗した…

Nagoya.vim #2 に行ってきた

9/20(土) に名古屋で開催された、Nagoya.vim #2 に行ってきた!初名古屋!
お昼前頃に現地に到着し、@ さん、@ さん、@ さんと合流してランチへ。みんなが味噌カツを食べる中私は特選名古屋コーチン親子丼を食べ、満足したところで Nagoya.vim 会場へ移動した。

本会

会場は和室でした!和むー。
全員が自己紹介と本日やることを発表し終えたところで、みんな作業開始。したかったのだけど、私は事前に頼まれていたライブコーディング的なことをしました。
いくつかネタのストックがあったので、その中から、バッファ内に行末スペースとかそういうアレがあった場合に statusline に警告表示を出せるようなプラグイン、を gdgd と作りました。
今回、作るものは本当に↑に書いた程度のことしか決まっていなくて、ユーザーからの設定方法とか内部的にどういう感じにしようとかそういうのが全く決まっておらず、手が止まっている時間がかなり長めになってしまって、参加者の中でも自分の作業の手を止めて私の作業を見ていた人にはすごい申し分けありませんでした。
今回学んだのは、作るものじゃなくてどういう設計にしようかもある程度は考えておかないと駄目だなってことだった。事前に作るのは反則としても、設計くらいは考えておかないとなぁ。
作ったものに関しては所々手直しして後日公開しようと思ってます。面倒になって忘れ去られる可能性もあります。
ライブコーディング以外では、相変わらず themis.vim の時期バージョンの作業をしてた。まだそれなりにかかりそう…ぐぬぬ

懇親会

本会が早めの時間に終わったので、早めの時間からやってる飲み屋さんで懇親会しました。
色んな話をしたけど、全体的に大体 @ さんと rogue.vim の話をしていた気がする。rogue.vim 以外の話があまり記憶にない。ヤバい…。
あとは名古屋で行くと良いスポットなどを教えてもらったりなどしました。

2日目

2日目って書いたけど、Nagoya.vim は全く関係なく、私と @ さんと @ さんと @ さんの 4 人で名古屋を観光した話なので、完全におまけです。ちなみに夜はホテルに泊まって3時頃までスマブラしてました。観光する気あるのか。
朝食は、懇親会で教えてもらった小倉トーストを食しました。完全にうまかった。トーストに載せる意味があったのかはわからなかったけどアンコうまい。
その後名古屋城まで散歩も兼ねて徒歩でテクテクと行き、名古屋城をグルッと見学しました。途中犬さんなどがベンチで休憩がてら進捗を出したりしていたので、Nagoya.vim っぽいなーとか勝手なこと思ってた。
続いて、同じく懇親会で教えてもらった、喫茶マウンテンへ。

これは普通においしかった!量がちょっと多かったけど。
最後に名古屋駅に戻って、ひつまぶし食べました。完全にうまかった。欲を言えば空腹の状態で食べたかった。マウンテンめっ…。
そんなこんなで名古屋を満喫しました。基本的にどこ行っても食べ歩きしかしてない。




今後 Nagoya.vim は精力的に開催されるとの噂があるので、今後の動きに注目したいです。毎回は無理だけど、機会があったらまた参加したいですね。