Quantcast
Channel: 永遠に未完成
Viewing all 95 articles
Browse latest View live

[vim] Vim script で AtCoder に参戦する方法

$
0
0

先週、進捗キャンプという知り合いで集まって進捗を出す会に行ってきて、そこで @ さんと表題の件について色々話した。

その後個人的に手法をカイゼンしたりしたので、結果をまとめておく。

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:一応別の方法で回避はできる。


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

$
0
0

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 = '******'

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

f:id:thinca:20151113191820p:image

…これはたまたま誰も遊んでないだけであって、フレンドがいないわけじゃないんだからね!

というわけでランキング画面を開いてみます。

:Ikaring ranking

f:id:thinca:20151113191823p:image

ちゃんとフレンドいますね。

ナワバリバトルのポイントが0になってますが、これは単に勝率が0%なだけです。バグではないです。

次にプロフィール画面を開いてみます。

:Ikaring profile

f:id:thinca:20151113191821p:image

出ましたね。ブキをとっかえひっかえしているせいでウデマエが全然上がりません。

一番下を見ると、塗りの合計も見れます。

f:id:thinca:20151113191822p:image

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

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

f:id:thinca:20151113191824p:image

わかりやすい。

苦労した点について

実はこのプラグイン、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][event] VimConf 2015 に行ってきた

$
0
0

VimConf 2015 に行ってきた。

昨年は主催的ポジションからの参加だったのだけど、今年は割と一般参加的ポジションで、一応スタッフって枠にはなってたけど大したことはしてないし、ラクさせてもらいました。

というわけで各発表についての感想を雑につらつらと。

Vimのgitへの移行について - @

まさかのスライドなし発表すごすぎた。

GitHub 移行は外からだと割とすんなり決まった印象があったけど、やはり裏では色々あったんですね。

deoplete ~ The dark powered auto completion plugin for neovim ~ - @

Shougo さんのバイタリティは相変わらずすごい。…すごい。

私はどのようにVim scriptを書くか? - @

Vim script 入門的な内容。これで Vim script 書く人増えるといいなー。

発表資料がすごく凝っててすごかった。

Hacking Libcall and Java - @

「一般的」の定義について考えさせられる内容だった。もはや持ちネタと言えるレベル。

発表中にツッコミが入ったりしてすごかった。

Vim on Browser - @

ブラウザ上で Vim を動かす話。

プラグインのデモがブラウザでできるってのはかなり便利そうさを感じた。

feature=small でしか動かせないのが残念だけど、普通に動いているのでとにかくすごい。

Vim + Clojure - @

Vim で Clojure を書くのに便利なプラグイン群の紹介。

今年も去年同様 Civilization 5 の話題が盛り込まれており、すごかった。

Introduction to OmniSharp.vim - @

OmniSharp.vim について話した。

たいがいキョドってるのでちゃんと伝わったかすごい心配…。

海外のVimmerが開発したVim pluginの紹介 @

One more thing すごい。

ぼくのかんがえたさいきょうのぷらぐいん vim-gita - @

gita 存在は知ってたけど、改めて見るとやはりすごい便利そうだった。

プログラマじゃないのにこんなの作れるなんてすごい。

まだまだ開発版っぽいので今後はもっとすごくなるらしいので期待したい。

Vim script版 power-assert について - @

power-assert、仕組みまでは理解できても、実際に作ってしまうのはすごい。

切り刻め!HTML - @

フロントエンド周りはあまり詳しくないので、必要になったときにすごく参考になりそうな情報満載だった。

ヘルプを読む - @

逆引きヘルプの提案がすごく便利そうだった。

vim-jpのvimhelp, reading_vimrcのホスト関連のお話 - @

Docker やらその周辺の使いこなし具合がすごかった…。

5年間Yokohama.vimをやってみて感じた事 - @

継続されている Yokohama.vim は本当にすごい。次回も是非参加したいです。

AppVeyorを使ってみよう @

vimproc については私自身はバイナリが欲しかったので、テストはとりあえずいっか、って思っていたのを k_takata さんがやってくれて、すごくありがたかったです。

Cygwin が動かないのは本当に謎…なんなんだ…。

まとめ

つまりまとめると、すごい。


最後に

VimConf は多くの方の協力で成り立っています。まとめ役をやってくれた @ さん、会場提供をしてくれた株式会社ミクシィさんと、その連絡役をしてくれた@Kuniwak さん、発表者の皆さん、スタッフの皆さん、そしてもちろん参加してくれた全ての皆さん、ありがとうございます!

VimConf は恐らく来年も開催されるとは思いますが、イベントをよりよくしていくために、以下のページで KPT をやっています。(KPT はふりかえり手法の1つで、詳しくはググってください google:KPT)

KPT for 2016

この KPT は特にスタッフ専用ということはないので、一般参加者の方でも、なんなら参加したかったけどできなかった方でも、Keep だけでも Problem だけでも Try だけでも、なんでもいいので書いてみてください。

みんなの意見がよりよい VimConf を作っていくはずです。

[vim][event] Vim に追加された assert 系の関数の紹介

$
0
0

この記事は Vim script Advent Calendar 2015 の 3 日目の記事です。

はじめに

先月末に、Vim の組み込み関数に assert 系の関数が追加されました。

今回はこの関数について紹介します。

歴史

割とどうでもいいので読み飛ばし可です。

2015-11-29 Vim 7.4.944

assertEqual()、assertTrue()、assertFalse() が追加されました。また、一緒に使うための v:errors も追加されました。

しかし、関数名について苦情が多く出ました

Vim script の組み込み関数の多くは、単語の区切りがなく1単語です。例えば deepcopy() や matchlist() などです。

一部の関数には _ が使われており、has_key() や complete_add() があります。

そして中には大文字を含む関数もありますが、今のところそれらは全て ID と言う単語に使われており、synID() や diff_hlID() などです。これらは例外と言えそうです。

つまり今まで camelCase が使われていなかったのにも関わらず突然 camelCase の関数が追加されたので、それはさすがにおかしいという話になりました。

2015-11-30 Vim 7.4.945

assertEqual()、assertTrue()、assertFalse() がそれぞれ assert_equal()、assert_true()、assert_false() にリネームされました。

また、先の話で別途提案された、各関数にエラー時のメッセージを渡すためのオプショナルの引数を追加するパッチが適用されました。

わずか1日でのスピード対応、ドキュメントもテストも修正されて完璧…と思いきや…肝心の実装が適用されておらず、関数名は変わっていませんでした…。

2015-12-01 Vim 7.4.946

無事実装も適用され、assert_equal()、assert_true()、assert_false() にリネームされました。

2015-12-03 Vim 7.4.950

一通り解決されたかに思いましたが、変数 v:errors が初期化されていないという問題が発見されました。

現在 vim_dev にパッチを投げています

恐らくすぐに適用されると思います。

適用されました

使い方

仕組みは単純です。

v:errors は配列になっていて、各 assert 関数が失敗すると、v:errors にメッセージが文字列として追加されます。

なので使用前にまず v:errors を初期化します。

let v:errors = []

続いて適当に assert 系の関数を呼びます。

function! Test() abort
  let actual = 2 + 2
  call assert_equal(5, actual)
endfunction

call Test()

v:errors を見ると、失敗の結果がわかります。

echo v:errors
" => ['function Test line 2: Expected 5 but got 4']

結果のメッセージの : の左側にある文字列は expand('<sfile>') の結果に行番号の情報を足したものです。

メッセージの右側には失敗時の値が出ます。

また、assert 系の関数には追加でメッセージを渡すことができ、渡すと : の右側はこのメッセージが表示されます。

let v:errors = []
function! Test() abort
  let actual = 2 + 2
  call assert_equal(5, actual, 'test fail!')
endfunction

call Test()
echo v:errors
" => ['function Test line 2: ''test fail!''']

終わりに

見てきたように、非常に簡単な仕組みのもので、なんなら Vim script で自作もできそうな仕組みになっています。

今後、Vim 本体での Vim script 周りのテストはこの関数が使われるようになるようです。

本体以外でも、簡易なテストが書きたい場合には使えるかもしれません。

[c++][event] Boost.勉強会 #19 東京 に行ってきた

$
0
0

C++ まったく書いてないけどなぜか Boost.勉強会 #19 東京 に行ってきたよ。

C++ の最近の動向に軽く触れる感じでゆるーく感想書いてく。C++ よくわかってないのでよくわからない感想しか書けません。

Boostライブラリ一周の旅 1.59.0-1.60.0 - @

資料: http://www.slideshare.net/faithandbrave/boost-tour-1600

資料(マージ版): http://www.slideshare.net/faithandbrave/boost-tour-1600-merge

いつものやつ。

Boost.Test v3 で Power Assert 入ったのだいぶ強そうだった。

Effective Modern C++ と C++ Core Guidelines - @

資料: http://www.slideshare.net/ShintarouOkada/boost19-effective-modern-cc-core-guidelines

Effective Modern C++ 邦訳版を査読した話と、CppCoreGuidelines の話。

査読報酬で具体的な話が聞けたのだいぶ良さがあった。

CppCoreGuidelines は lint を提供することを想定しているとのことで、使えるようになったらとても便利そう。

詳しくない言語を書くとき、良い書き方なのかいつも気にしながら書こうとしてしまうのでそれだけでかなり時間がかかってしまうのだけど、lint があると安心して書いていけそう。

SIMD のゆるい話 - @

資料: http://www.slideshare.net/krustf/avx-simd

ゆるい話…なるほどわからん、という感じだった。すまぬ。

「女性のためのC++コミュニティ Ladies++ meetup #1」の紹介 - @

資料: http://www.slideshare.net/cocodrips/c-ladies

女性のためのC++コミュニティ Ladies++ meetup #1 の紹介。

コミュニティが始まったばかりで人脈があまりないので女性 C++er を紹介して欲しいとのことです。

クロスプラットフォームマルチメディアライブラリSDL2の紹介 - @

資料: http://www.slideshare.net/nyaocat/sdl2

SDL2 の紹介。

いつの間にかライセンスが zlib になっていたのと、Emscripten でブラウザにも対応していたの知らなかった。

クソザコ鳥頭が非順序連想コンテナに入門してみた - @

資料: http://www.slideshare.net/kariya_mitsuru/ss-55842496

非順序連想コンテナが仕様である処理時間を定数時間にするための実装の苦労がおもしろかった。

expectedによるエラーハンドリング - @

資料: http://www.slideshare.net/faithandbrave/error-handling-using-expected

expected の紹介。

Haskell の Either に成功/失敗の明確な意味を持たせたものと解釈した。

単に成功値か失敗値が欲しいというだけなら、variant でも目的は達成できるのかもしれないけど、インターフェースが成功/失敗に特化して作ってあるし、何より明確な意味があるのは便利。

Boost.Configについて - @

資料: http://www.flast.jp/article/boost-19-tokyo/index.html

コンパイラや C++ のバージョンの差異を吸収するための中の人が使うライブラリの話。

なんというかやはり苦労してるんだな…という感じ。

メモリモデル再入門 - @

資料: https://docs.google.com/presentation/d/1ClVZvXo8lj7TE66hZ0eqNyVc1DBcRciJRXUxukhOb2k/pub#slide=id.p

スレッドとか Data Race とかの話。誰でもわかる基本的な例から徐々に複雑な例にしていく解説が上手いなと思った。

なかなか面白い話だったのでスライド最後まで完成させてほしかった…。


全体的な感想

割とわからないことだらけかなーとも思ってたけど、面白いセッションも結構あって良かった。

相変わらず C++ 書く機会ないですが、C++ は割と好きな言語なのでまた機会があれば参加したいです。

[vim] 全角スペースを可視化するプラグイン zenspace.vim を作った

$
0
0

プログラミングをしていると、混ざっていると困る全角スペース。

可視化するように設定を書いている人も多いんじゃないでしょうか。

実際ググると、全角スペースを表示するための設定がたくさん出てきます。私も vimrc に設定書いてました。

でもこれ…みんなやってるなら、もうプラグインでよくない?

ってことでプラグインにしました。

zenspace.vim - Show Ideographic Space (a.k.a. Zenkaku Space).

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

全角スペースを表示するためだけのプラグインです。(タブの表示は 'listchars' によるもの)

f:id:thinca:20160214105833p:image

デフォルトでは 'list' オプションの値に連動して、可視/不可視を切り替えます。なので、'list' オプションをオンにしてください。

set list

'list' オプションとかいいから常に表示しろよ、って場合は g:zenspace#default_mode を設定してください。

let g:zenspace#default_mode = 'on'

zenspace.vim は、常に表示する "on"、表示しない "off"、'list' オプションに追従する "list" の 3 つのモードがあり、ウィンドウ毎に独立しています。

デフォルト値を変える場合は上記の通り g:zenspace#default_mode を設定してください。個別のウィンドウで変更したい場合は :ZenSpaceOn :ZenSpaceOff :ZenSpaceList を使用してください。

Q & A

Q. 色を変えたいんだけど?

A. 赤に変える例を載せておきます。

augroup vimrc-highlight
  autocmd!
  autocmd ColorScheme * highlight ZenSpace ctermbg=Red guibg=Red
augroup END

Q. 普通のスペースとかは表示できないの?

A. 全角スペース専用です。通常のスペースやタブや行末スペースは、Vim 標準の 'listchars' オプションを設定するといい感じに表示できるので、そっちを使うことをオススメします。

Q. Conceal とか使って□で表示できない?

A. 検討したんですが、Conceal の制限がキツすぎて見送りました。詳細はこちらを読んでください。


Enjoy!

momonga.vim #4 に行ってきた

$
0
0

momonga.vim #4に行ってきたよ。

前回は午前中からだったけど、今回は午後から。会場の武蔵野プレイスはかなりの人気施設で、予約開始直後に予約がいっぱい入ってしまい、なかなか1日中は取れないらしい。
私は早めに行って、同じく早めに来た @さんや @、主催の @さんと一足先にヨーカドー地下のフードコートでランチ。
色々あってラーメンは避けようと思っていたんだけど、一通り見た結果ラーメンが一番おいしそうだったので結局ラーメンを食べることに…。
結果、こういう残念なことになった。

本編

それはそれとて会場に着いて、簡単に設営したら作業開始。私は、先日 qfreplace.vimに Issue が同じ人から大量に飛んできてたので、それらに対応するなどしました。結果、qfreplace.vim、細かいところがちょろちょろ変わった。普通に使っている分には気付かないかもしれないレベル。一部動作に互換性のない変更をしたので、問題があったら教えてもられると助かります。
その結果、本来進めたかったテスティングフレームワークについては完全に進捗ありませんだった。来週の TokyoVim でリベンジ。

夕食 (2次会)

サイゼリヤに13人で押し寄せて夕食。一部の人がラブライブの話をしていた気もするけど*1、基本的には Vim談義に花を咲かせつつ、私はここでも進捗を出そうと PC を開くなどしてました。あ、ちなみに3次会まで含めて qfreplace.vimの作業しかしてません。つらい。

カラオケ (3次会)

19時から29時まで耐久カラオケ。10時間すごい。まあ耐久と言っても途中普通に誰も歌ってない時間とかあったけど。
最初は10人で、23時の段階で徹夜しない組の4名が帰宅。残り6人のうち、完全に歌わないで作業だけしてる組が2人。結果、私は進捗しつつ結構歌ってた。
23時過ぎた段階で vimrc 読書会のことをすっかり忘れていて、少し遅れて開始するなどもしました。


今ようやく無事帰宅して眠いなかこの記事書いてます。完全に眠いけど楽しかったのでまた次回も行きたいです(小並感)。
ちなみに次回の momonga.vimは 7/26(土) の予定らしく、それとは別にもしかしたら 7/5(土) に momonga.clj をやるかもと言ってました。詳しいことはももんがさんに聞いてください。では寝る。

*1:私はラブライブわからない勢です

TokyoVim#20 に行ってきた

$
0
0

行ってきました TokyoVim#20。前回は参加できなかったので、#18 以来の参加。

今回は、以前から作っていた目下開発中の Vim script 用のテスティングフレームワーク「themis.vim」について、主に犬さんからただならぬプレッシャーを感じとり、こいつを完成させるべく Twitterしながら必死で作業するなどしました。
会場で悩んでいる部分についてみんなに相談できたりなどしたので、完成にこそ至らなかったけど、最近の中だと割と進捗が出たように思います。良かった。
この「themis.vim」ですが、かなり開発を引き摺ってしまっているので、えいやっとがんばって今月中にリリースを目標にしたいと思います!今月はまだ Aizu.vim #02Osaka.vim #1と、2 回も もくもく会があるので、がんばればいけるはず…! ちなみに Aizu.vimはまだ枠が空いており、Osaka.vim懇親会はまだ枠が空いていて、懇親会のみの参加も歓迎なので、興味ある方は是非(宣伝)。リリースできたら改めて記事を書きます!

終了後は8人ほどで夕食へ。毎度ジョナサンなのも味気ないので、駅の方まで行って目に入った俺たちのナポリタンってとこに入った。トッピングが色々組み合わせられて、大盛(600gとの噂)無料だったので、なかなかよかった。壁に貼ってあった1800g完食2名に戦慄した。
他に客があまりいないのをいいことに、食べ終わった後も PC 広げて雑談しながら進捗などをしていたら、さすがに店員さんに睨まれ始め、8時半前くらいに声をかけられて解散に。入口には営業22時までと書いてあった気がするけど、出る時にはすでに Close の札がかかっていたという証言があり、まあずっと居座っていた我々が完全に悪かったので、本当にすいませんでした。
それはそれとして居座っていた分いろいろお話できた。Atomどうよって話に、端末で使えないのはちょっと…って話が出てきたり、そもそもどういう機能が揃っていたら他のエディタに移行できるのか、みたいな難しい話もあったけど、まあ結論は出なかった。



次回はいつになるのかまだわからないけど、7月はすでに土曜の予定がすべて埋まっており、参加は難しそうな予感です(なさそうだけど日曜開催ならワンチャン)。まあいつになるかはわからないけどまた次回楽しみにしてます!


Aizu.vim #2 に行ってきた

$
0
0

Aizu.vim #2に行ってきたよー。初会津です。
新幹線で郡山まで行ってから、更に電車に揺られること1時間10分。途中流れる山々の景色を眺めつつ、のんのんびより2期に思いを馳せるなどしました。
到着した先はさすがに途中で見たほど山って感じではなくてちょっと安心。
向かえに来てくれた @さんと一緒に @さん宅へ行き、一緒に泊まっていた @さんも含めて合流して、4 人でソースカツ丼や手作りアイスを食べるなどしました。


ここまで Aizu.vim全く関係なかった。完全にグルメ観光の話だった。


その後会津大学へ行き、Aizu.vim開始!本会は、最初に全員で自己紹介、その後 Mopp_jp さんによる初心者向けのプラグインの作り方講座があり、あとはみんなでプラグイン開発ハッカソンをする、といった流れ。
私はと言うと、前回の TokyoVim でもちらっと書いたスティングフレームワークについて、Linda_pp さんにプレビュー版を渡して色々ダメ出しをもらいつつ直していく、ということをしていた。
全体的にかなり意見を貰えて、非常に助かった反面、課題がまだかなりあることが露呈してしまった…リリースが…いや、機能絞ってがんばって出そうかとは思います。ただリリース直後は既存のフレームワークと比べてあまり大きなアドバンテージはないかも。やはり Linda_pp さんも愛用している vspecがかなりよくできていてぐぬぬを禁じ得ない。
私の隣は @でした。なんと新潟からの参加。東京から言った私が言うのもなんだけど、すごい。dictav さん、イベントの主催力がハンパないので、ほんとすごい。
18時(終了1時間前)になった時点で、軽くみんなの進捗発表兼困ってる箇所があったら相談みたいなことをした。プラグイン作成初心者の人も結構いたので、そんな進捗とか言われても…みたいなところはあった感じがあるけど、中には vital.vimを使って Web 叩いたりしてる人もいた。良い。


終了後は、何人かで喜多方ラーメン食べに行きました。実は翌日健康診断だったんだけど、多めのセットを頼んでしまった。せっかく会津まで行ったのだ。悔いのないようにせねば。健康診断が怖くてラーメンが食えるか!


そんなこんなで、非常に濃い日帰り会津旅行でした。
ちなみに Aizu.vimとしては、GitHub に Organization が作られていたり、その一環でヅ大生向けのプラグインを作る試みがあったりと、今後の活動に期待が寄せられます。次回 Aizu.vim #3 は 9 月頃を予定しているとのことなので、まあ私はさすがに毎回行ってたら旅費がやばいので行けないと思いますが、今後の活動に期待。またそのうち参加したいです。

Osaka.vim #1 に行ってきた

$
0
0

Osaka.vim #1に行ってきたよ!初大阪!
直前にキャンセルが相次いでしまったけど、それでも 16 人もの Vimmerが参加。
京都の学生さん率が意外に高くて、京都の学生さんすごい。兵庫からの参加者もいました。関西圏の距離感よくわかってなかったんだけど、そこまで遠くないっぽい。私が Yokohama.vimに行くくらいの感じなのかな。遠方だと名古屋からの参加者も。すごい。


肝心のやったことなのだけど、まずは事前に告知していた通り、私がライブコーディングっぽいことをしました。
全体的に進行がグダグダだったのは申し分けない。事前にお題を考えている時には、他に案がなければ私の vimrc に書かれている、空バッファを自動的にメモ用のバッファをプラグイン化しようかなーと思っていたのだけど、これ用は vimrc の設定をほぼプラグイン化するだけだし、ライブコーディングじゃないだろーって気がしたので、他の人にも声かけつつ他のお題を模索していたのだけど、結局当日まで他に良い案が浮かばなかったので、これで行くことになった。
ライブコーディングって、私の記憶だと確か、以前作ったことがあるものを再び作るのはライブコーディングとは言わないって聞いていたので、今回のコレ微妙にライブコーディングじゃないんですが、私が伝えたかったのは、Vimプラグインって意外と簡単に作れるんだよってことなので、まあそこは気にしないことにします。
で、プラグイン化までは考えていたけどプラグイン名を考えていなかったのでその場で超適当に決めて、その場でやってることを解説しつつ随時質問を受け付けつつ、コピペしてプラグインとして整形する作業などをしました。
途中で色々質問してもらえたのは有り難かったです。ただ見てるだけだと、なんかよくわからんうちに完成した、で終わってしまうので、質問が入ることで理解が深まって話題も広がる感じがありました。
で、ただ移植するだけなのもさすがにアレなので、メモバッファ一覧を見る機能を追加したり、それとは別に一覧を見れる unite.vimの source を追加したりなどしました。その過程でちょっと不都合があり、unite.vim側を Shougo さんに修正してもらう*1などのサプライズ(?)などもありつつ、でき上がったプラグインがこちらになります。

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

さっきも書いたけど、名前は超適当に決めたので、今後カッとなって変更するかもです。その場合はここに追記します。
で、あと、このプラグインですが、無名バッファを開いたらそいつに対してゴニョゴニョするってプラグインなので、他のプラグインと動作がカチあう可能性がかなりあります。プラグイン化を渋っていたのはその辺りもあったり。カチあう部分は可能な限り回避したり回避手段を用意したりしたいところなんですが今のところ全くないので、使う場合は自己責任なのはまあ当然なんですが他のプラグインより注意して使ってください。まあそもそも実用性怪しいのでよくわかってなかったら使わないのが無難。


ライブコーディング終わった後はみんなそれぞれ自由に作業しつつ、色々周りに聞いてみたり、お話したり、など。
印象的だったのが、みんなよくしゃべる!そこはやはり大阪だからなんですかね。
東京のもくもく会は本当にみんなもくもくで、それはそれで作業進んでいいんですけど、せっかく集まってるのになぁって思ってた部分もあったので、この雰囲気は良いなーと思いました。常に誰かがしゃべっていた印象。


そんなこんなで本会は終わり懇親会へ。オサレな雰囲気のお店で鉄板料理(なのかな?)を堪能しました。@さんが Vimをリスペクトしつつ全力で Atomへ移行しようとしていたり、チャットツールの話とか、本職エンジニアじゃないけど Vimで作業効率改善しまくりで Vim便利すぎる、みたいな話をしました。


終了後は何人かで徹夜カラオケへ。6人で入り、1人は賢明にも終電までに抜け、あとは5人で歌いまくりながら進捗するなどしました。vimrc 読書会などもやった。朝の5時過ぎくらいに解散しました。


徹夜だったのもあり疲れたけど大変楽しかったです。次行けるのいつになるかな…大阪となるとさすがに毎回は行けないと思いますが、またそのうち行ってみたいです!ちなみに次回開催は8月くらいにやりたいとか平日定時後もワンチャンみたいな話がありましたが詳細は未定。

*1:一応書いておくと、unite.vimがバグっていたわけではなく、こうなってるとこちらとしては都合が良いなー的な修正でした

Vim script 用テスティングフレームワーク themis.vim を公開した

$
0
0

作ろうと思ったのが 2013年3月。1ヶ月くらいでサクっと最低限動くものを作ろうかなぁくらいの軽い気持ちで作り始めたわけですが、悪い癖をこじらせて、気付いたら1年以上経ってました…。
いい加減よろしくないと思い、先日の記事に書いた通り、えいやっとリリースすることにしました。長かった。

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

経緯を見るとわかるように、正直なところ出来はまだまだです。一応使える、くらい。半端に作りかけていた部分をガリガリ削ぎ落として最低限の体裁を整えてのリリースです。既存のテスティングフレームワークをお使いの方は、乗り換えるメリットはあまりないように思う。
まだ全然満足が行く出来になってないので、これから徐々に仕上げていこうと思います。少なくとも今後自分で使っていこうと思えるレベルまで持っていかないと…。
まだまだこれからなのと、単純に面倒なのでこの場で使い方とか特徴とかの説明はしません。バグも当然沢山あると思います。それでも興味あるって人だけがお試しください。

momonga.vim #5 に行ってきた

$
0
0

momonga.vim #5、行ってきました。

いつも通り早めの時間に @さん宅に何人かで押し入り、一緒にバーガーキングでランチ。@さんがキングサイズのコーラを頼んでがんばってたけど結局飲みきれずに捨ててた。
今回はいつもとちょっと違っていて、いつもは会場にギリギリに着いてしまっていて、会場の前で待っていてくれている人達に悪いなぁ、と言うか特に初参加の人とかは不安にさせちゃうよねぇって話があったので、今回はいつもより早めに15分前に会場に付くように前もって時間を調整。悠々と会場に着いた。かなりいい感じだったのだけど、電源タップを持ってくるのを忘れていて、取りに戻っていたら結局時間通りに開始することはできなかった。無念。
そんなこんなでもくもく会開始。私は先月末に公開した themis.vim関連のタスクをガリガリやっていた。元々急いで取り繕って公開したので、欲しいと思っている機能が全然足りていない。できれば本会中に次のバージョンの v1.1 を出したかったのだけど、進捗と言うやつはどうにもじゃじゃ馬で全く制御できず、何も知らないとバグのようにも見える仕様にぶち当たってその調査や報告をしていたり、他の人から相談を受けたり*1、テスト失敗時のメッセージやテストコードでのテストの説明文やら英語を書くシーンが多くて英語力なくて死んでいたり、やること途中から自分で増やしていたりしたものだから当然終わるわけもなく、これを書いてる今も終わってないです。つらい。
最後に進捗報告会があって、みんな報告していたのだけど、私は進捗を出すのに必死で半分くらい聞いていませんでした。完全に良くない。おかげで、話を振られたのに全く聞いていなくて同じ話をもう一度してもらうということを2回くらいしてしまった。反省。次回からは報告会の最中は完全に手を報告を聞くことにします。
終了後は14人でディナー。サイゼリアに入ったら 4/4/6 人で分断されたけど、ちゃんと話するならこれくらいの人数の方がしやすいので、かえって良かった気もする。
相手の Vimレベルを知るにはどんな質問をすると良いのかっていう話題が出て、確かにみんな過小評価したりするので、素直に聞いても「初心者です」みたいになってむずい。そこで、その場で私が思い付いた質問なのだけど、「今 Vimで困ってることはなんですか」っていうのがかなり良さそう。困っている内容である程度レベルがわかる予感がする(未検証)。困ってることがないって人がいたら、余程の達人か大して使っていないかのどちらかっぽい。
そんなこんなでディナーも終わり、何人かは帰り、7人ほどは残ってももんが邸でもくもく会延長戦。7人入るのは新記録で、そのために最初にまず部屋の片付けを行い、色々不要な物を処分するなどして、ももんが邸が生まれ変わるなどしました。掃除もできてしまう momonga.vim便利。
その後みんなでもくもくし、ほとんどの人が終電までに帰って行く中、私とももんがさんだけ残って夜遅くまで作業したり夜食にラーメン食べたりするなどしました。これだけ頑張ってまだ進捗が出ていません。つらい。
翌朝(昼)にももんがさんと二人でCoCo壱ランチをして帰宅しました。良かった。


なんか毎度表に出せるような進捗を全然出せずに終わってしまっている気がしていて、目標設定とかやり途中のタスクの兼ね合いとかもあるのだろうけど、やはりつらいので次回は何か表に出せる進捗を出せたら良いなあと思っています。
次回は…あっ来週ですね!momonga.vim #6はなんとドワンゴで開催!初ドワンゴ楽しみです。果たして進捗は出せるのか…続く。

*1:一応言っておくと相談は大歓迎。それでこそ実際に会ってもくもく会をしている意味もあるというもの。私の進捗とか気にしなくて良いよ!

momonga.vim #6 に行ってきた

$
0
0

momonga.vim #6に行ってきたよ!初ドワンゴ

momonga.vim #6 β

本会開始前に、数人で集まって会場近くのカフェでプレもくもく会などをした。電源が完備されており、とても便利だった。

本会

規模は大きかったけど、島が分かれていることで、かなりいい感じになったのではないかと思う。これなら次回はもっと人数多くても行けそう…!?
ただやはりというか、お話できない人がかなりいた。まあそういう会ではないので仕方ないんだけど。たまに自分の進捗を放棄して他の人の様子を見て回ったりしたくなるけど、自分の進捗が出ないのと、相手の邪魔になるんじゃないかという思いがあり、なかなか実行できない。この辺りバランスむずい…。魔法の言葉「進捗どうですか」はもっと使っていきたい。

成果

私は themis.vimの Version 1.1 を公開すべく、そのための作業、具体的には themis.vim自身のテストを書くという作業をずっとしていて、テスト書いてはバグっぽいのを見付けて直したりリファクタリングしたくなったりして、全然進まなくてつらい感じだった。
残念ながら会の最中に成果を出すことはできなかったんだけど、ついさっき残りのテストを書くのを諦めて Version 1.1 の RC をブランチで公開したので、興味ある人は見てみてください。特になければ遅くても来週には master にマージ予定。
ここで、Version 1.1 で具体的に何が変わったのかを紹介。

本体にテストが付いた

ただし、↑でも書いたけど、正直テストが全然足りてないです。ないよりかはマシだろ的なアレ。今後ちょっとずつ追加していきたい…!

dot reporter の改善

エラーが出てもエラー内容が一切報告されないという手抜きぶりだったので、ちゃんと報告されるようにしました。しかし実はもうちょっと情報が欲しい…。

command helper の追加

command helper を追加しました。
こんな感じになります。

lets:assert = themis#helper('assert')call themis#helper('command').with(s:assert)function! s:suite.test()" :Assert に真を期待する式を与える
  Assert 1+1==2" Equals や HasKey は with で与えた s:assert のもの" assert を使う利点は、失敗した時に各引数の実際の値がレポートで見れる
  Assert Equals(1+1, 2)
  Assert HasKey({'foo': 0}, 'foo')" 例外チェック。/pat/ は省略可
  Throws /^error$/ :throw'error'
  Throws /E119/ type()endfunction
assert helper

has_key() や type_of() など、いくつか関数を追加しました。

進捗報告会

@さんが作っていた英文法チェックプラグインはすごい便利そうなので、リリースされたら使っていきたい。私の英語、完全に Engrishなので、エラーでまくりそう…。
@さんのマリオは完全にやばかった。あとはセル単位ではなくピクセル(文字)単位での移動ができるともっと良いと思います!
@さんが Vim Colorscheme Galleryを改良していた。ColorScheme、light と dark 以外にも、light と dark 両対応しているものもあったり、赤系青系みたいに特定の色に偏らせたものとか、淡い系とか濃い系とかいろいろあるので、その辺りカテゴライズされていると便利そうな予感はある。そのためには展示する ColorScheme を大量に用意しないと寂しくなりそうだけど。

懇親会

妖怪ハウスにお邪魔しました! 江添さんお手製のピザをご馳走になったり、アイスを食べたり、ボードゲームが置いてあってやりたくなったり、進捗したりしていました。
11時頃にさすがに時間がやばいので撤収。次お邪魔する機会があったらボードゲームしたい。



そんなこんなで今回も非常に楽しかったです。次回は mixi開催との噂もあり、Vim熱の高まりを感じます…! 目指せ武道館!?

Vim script テクニックバイブルが発売されました

$
0
0

先週の 8/6(水) に、私も執筆に参加した Vim scriptテクニックバイブル 〜Vim使いの魔法の杖(Amazon) が発売されました。中にはもうすでに購入して読んだ、という方もいると思います。ありがとうございます。
読んだ人ならわかるかと思いますが、この本は入門書です。本書内の読者へのコメントにも書きましたが、応用的な内容や、Vimの全ての機能が紹介されているわけではありません。なので、すでに Vimプラグインをバリバリ書いて公開しているような人には、物足りない内容だったと思います。
これは逆に言えば、初心者に向けて丁寧に書かれているということでもあります。Vimをもっと便利に使いたいけど、Vim script とか触ったことないし…というあなたこそ対象読者です。入口のとっかかりとしてはとても良い本になったんじゃないかと思います。
最後にプラグイン作りに関するアドバイスを1つ。本書をただ漠然と読んでも、さて、次はどうしよう? となることでしょう。プラグインを作るということはすなわち、エディタ環境をカイゼンする、ということです。カイゼンするためには、今の環境で困っている、不便な点を見付けるのが重要になります。不便に敏感になりましょう。同じ操作を繰り返していないか。やりづらいことはないか。既存のプラグイン達を見ていると、様々な不便をカイゼンしてくれます。あなたのアイディア次第で、エディタ環境はもっともっと便利になるはずです。カイゼンしたいけど Vim script わからない、そんな時に本書が役に立てば幸いです。

この本に触れた人が、新しい Vimプラグインを作って公開し、Vimがもっと便利になっていくのを楽しみにしています。

momonga.vim #6.1 に行ってきた

$
0
0

momonga.vim #6.1に行ってもくもくしてきた。
momonga.vimの小数点回は、少人数によるももんが邸を会場にしたもくもく会。会場キャパの問題があるので、大体いつもほぼ決まったメンバーで行われることが多い。
今回は過去最長、だいたい32時間くらい滞在していた。すごい。

9日の13時前頃にももんが邸着。その後みんなでてんやでランチして、夜までもくもく。夜になったらイトーヨーカ堂地下のフードコートで長崎ちゃんぽん他などをディナーとして食べたあと、戻ってマスクメンなどして遊びつつ再びもくもく。途中vimrc読書会なんかも挟みつつ、夜は寝る人は寝たり寝ない人はがんばったりしつつ、朝になったらバーガーキングでブレクファストを取って、戻ったら更にもくもく。昼になったらゲーム音楽三昧が始まったのでそれを流しつつもくもく。3時頃に途中フードコートにランチのようなおやつのような軽食(?)の休憩を取りに行って、戻ってきたらもくもく。最後は8時過ぎにラーメン屋でディナーをし、解散しました。長かった。ほぼ飯のことしか書いてない。
もくもくと書いたけど、実際にはほぼ常に誰かしゃべっていた感じで、終始賑やかな感じでとてもよかったです。だいたい何かある度に、「わかるー」「あるあるー」「便利ー」とか言ってた気がする。徹夜テンション。

進捗

肝心の進捗としては、私は主に themis.vimの改良作業をしていた。先日 Version 1.1 を master にえいやっとマージしたので、次は 1.2 の作業。細かいオプションの追加とかをしていた。
残作業としては、.themisrc 的なファイルの機能を付けようかなーと思っている。全テストの前に1度だけ読み込まれる Vim script ファイル。helper なんかをここで global に設定しておけば、各テストファイルでいちいち設定する手間が省けるはず。読み込まれるファイルは、テスト実行時にディレクトリを指定した場合とファイル単体を指定した場合で変わって欲しくないので、指定されたファイルorディレクトリの辺りから上階層に見ていって見付けたやつ全部使う、みたいな感じになるのかなぁーと思っている。この方法で問題ないか、まだあまりちゃんと考えてない。何か要望があればすぐになら受け付けられるかも。
その他としては、せっかくテスティングフレームワーク作ってるので、CI 環境を整えるなどしていた。むしろこっちの方が時間取ってた。こちらに関しては後日記事に書こうと思う。
あとは、細々と threes.vimの 1.5 をリリースした。簡易的なレコード機能を付けた。本当はもっとしっかりしたのを付けたかったんだけど、完全に作業中のまま数ヶ月放置してしまっていたので、とりあえず動いているっぽいしやりかけだった部分をちょろっと整えて、ほいっとリリースした。やりかけていた部分、何か懸念があってやりかけていた気がするんだけど、完全に思い出せず、そのままリリースしてしまったので、何か問題があるかもしれない。何かあったら報告してもらえると助かります。threes.vimは将来的にはリプレイ機能とか載せたいとか考えているけど、やってる暇があるかどうか不明。



とまあそんなこんなで、とても濃い2日間でした。疲れたけど楽しかった。実は最初は泊まる予定なかったんだけど、ももんが邸もくもく会では翌日予定がなければ大体泊まるのがパターン化してきたので、次からはちゃんと準備して臨もう、などと誓ったのでした。次は 8/30 に #6.2 があるらしい。


Vim プラグインを Windows 環境でテストする

$
0
0

最近は専ら Vim script 向けテスティングフレームワークthemis.vimを作っているわけですが、テストを書いたら当然実行しないと意味がないわけです。
しかし手動でテストするのは面倒。そこで CI。設定しておけばリモートのリポジトリに push した時に自動でテストを走らせてくれます。
Linux環境用の CI サービスはたくさんあるので、Travis CIなり drone.ioなり自由に使えば良いと思います。便利。
しかし Vimマルチプラットフォーム。当然 Windows環境でもテストしたいですよね。と言うわけで Windows環境で CI できるサービスと、そこで themis.vimを使ってテストを走らせる設定例を紹介します。全部無料でできます。


と言うわけで CI サービス AppVeyor を使います。
Continuous Integration and Deployment service for Windows developers - Appveyor


AppVeyor は .NET向けの CI サービスです。.NET と言うことは当然 Windows環境。便利。

まずはアカウント登録。と言っても GitHubや BitBucket などのアカウントを持っていればそちらからログインできる。簡単便利。

次にテストを走らせたいプロジェクトを登録します。

GitHub連携などが済んでいれば、リポジトリ一覧が出てくるのでそこから選ぶだけです。
登録できたら以下のような感じでテストを設定。

スクリプトは以下のような感じ。PowerShellスクリプトです。流れとしては、themis.vimを取得し、Vim本体を香り屋さんのところからダウンロードし、テストを走らせます。古い Vimでテストしたかったらダウンロード元の URL をこの辺りから適当に変える感じで。

git clone --quiet https://github.com/thinca/vim-themis.git themis

$zip = $Env:APPVEYOR_BUILD_FOLDER + '\vim.zip'
$vim = $Env:APPVEYOR_BUILD_FOLDER + '\vim'

(New-Object Net.WebClient).DownloadFile('http://files.kaoriya.net/vim/vim74-kaoriya-win64.zip', $zip)

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') > $null
[System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $vim)

$Env:THEMIS_VIM = $vim + '\vim74-kaoriya-win64\vim.exe'

& $Env:THEMIS_VIM --version
.\themis\bin\themis.bat -r

更新: 香り屋さんの指摘でダウンロード元のURLをリダイレクトなしのものに差し替えました

最後に Save を忘れずに。
あとは実行すれば…

こんな感じで結果がでます!

https://ci.appveyor.com/project/thinca/vim-threes/build/3 (スクショだとでかくなるのでリンクで)

pull req に対するテストも走らせてくれます。とても便利。

Vim script 向けのテスティングフレームワークは数多くありますが、私の知る限りでは、コマンドラインから実行できてかつ Windowsでも動く汎用のテスティングフレームワークは themis.vimだけだと思います。この辺りの事情も themis.vimを作った理由の一つです。
皆さんも、Windowsでテスト、始めてみませんか?

winenv.vim 作った

$
0
0

momonga.vim #2.2 で作っていたアレです。
あのあとすぐ、細かいバグを取ったりして本体の実装は完了したのだけど、その後ドキュメントを書くところで面倒になって長らく放置…。
しかし本日、yuk(balloon-stat)さんが、unite-winpathなるものを作ったと言う報告をされて、これはやばいと思って重い腰を上げてさっきドキュメントを書き上げてリリースしました。やはり後回しにするもんじゃないですね…。

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

何をするプラグインなの?

Windowsを使っている人ならわかると思うんですが、Windowsでグローバルな環境変数とかを設定するの、すごく面倒ですよね。Vimから編集できたら便利そうです。これはそのために便利するプラグインです。
勘のいい人は気付いたかもしれないですが、これはレジストリを操作する系のプラグインです。バグっていた場合非常に危険なアレです。使用は自己責任でお願いします!

簡単な使い方

:WinEnv コマンドを使うと、バッファが開きます。以下のような感じ。

:WinEnv
        {place} の一覧を開きます。Windows の環境変数にはシステム環境変数とか
        ユーザー環境変数とかがあって、それらのこと。<CR> するとそれぞれの環境変
        数の一覧が見れる。
        ちなみに VOLATILE と言うのがあるけど、これは現在のログインセッションの
        間のみ有効な環境変数らしい。私も今回これ作るまで知らなかった。こんなん
        あるのねー。

:WinEnv {place}/
        {place} にある環境変数の一覧が見れる。<CR> すると編集できる。

:WinEnv {name}
:WinEnv {place}/{name}
        環境変数を編集するバッファを開く。{place} を省略すると、
        g:winenv#default_place が使われる。これのデフォルトは SYSTEM。
        編集したら保存すると環境変数の変更が適用されます。

環境変数 PATH と PATHEXT は特別扱いされていて、; 区切りの各項目が1行ずつになって表示される。
他にもこういう特別扱いすると嬉しい環境変数があるかわからなかったので今のところ固定。要望があれば設定可能にするかもです。

中でやってること

このプラグインには bin/winenv.bat って言う bat ファイルが入っていて、これ単体でもコマンドラインから動くように作ってある。
で、最近の Windowsでは、SYSTEM の環境変数を操作するためには UACがどうたらとかあって、権限を昇格させないと操作できない。
ここが非常にネックだったのだけど、この辺り資料や試行錯誤の結果、必要ならダイアログを出して権限を昇格させることに成功。やりました。
なので、SYSTEM の環境変数を変更する際には毎回 UACのダイアログが出ます。まあでも通常の方法に比べれば全然ラク。

今後

  • unite インターフェースがあると便利そう
  • 環境変数名と一緒に値も同時に出る view があると便利そう

今後とか書いたけどやるかどうかは完全に未定。やる気が出るかと要望があるか次第です。

momonga.vim #6.2 に行ってきた

$
0
0

去る週末の土曜日に、momonga.vim #6.2 に行ってもくもくするなどしました。
ポポラマーマでランチにパスタを食べ、夜は寿司でも食べようかと思ったけど人数的に入れなかったので適当にラーメンを食べ、半徹夜明けの日曜はバーガーキングで遅めの朝食を食べて解散するなどしました。
おいしかった。おしまい。




と言うわけにも行かないので進捗の話をします。
私は themis.vimのバージョン 1.2 の作業をしていて、リリース候補版のブランチを push することに成功しました。

https://github.com/thinca/vim-themis/tree/v1.2dev

様子を見つつ遅くても今週中にはマージしようかと考えてます。様子見ると言ってもこれ試して不具合や要望をしてくるような人がいるかどうかかなり怪しいので、まあそのままマージされる可能性が高いです。
できればもうちょっと本体のテストを追加してからマージしたい気持ちはあるけど、面倒になったらやらない可能性もある。しかしできれば増やしたい。つらい板挟み。
ちなみに 1.2 の目玉機能としては、.themisrc ってファイルで色々事前処理ができるようになりました。詳しくは help を。

そんなこんなで、themis.vimはこれの次の 1.3 でようやく個人的に使えると思えるレベルに達する予定です。ここまで行ったら vital.vimで使うよう提案してみる予定。はやく 1.3 まで漕ぎつけたい。
と言うわけで momonga.vimは結構作業捗るのでとても良い感じがあります。次回いつかなー。

Nagoya.vim #2 に行ってきた

$
0
0

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は精力的に開催されるとの噂があるので、今後の動きに注目したいです。毎回は無理だけど、機会があったらまた参加したいですね。

VimConf 2014 を開催しました

$
0
0

去る 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:当選者メモっておくべきだった。失敗した…

Viewing all 95 articles
Browse latest View live




Latest Images