RSpec の is_expected で raise_error を検知したかった

RSpec では subjectis_expected を利用して次のようにテストを書くことが出来ます。

context "test" do
    subject { 42 }
    # is_expected の内部で subject が呼び出される
    it { is_expected.to eq(42) }
end

raise_error を使いたかった

次のように raise が発生する場合は is_expected を利用することが出来ません。

context "test" do
    subject { raise RuntimeError  }
    it { is_expected.to raise_error(RuntimeError) }
end

これは is_expected が内部で expect(subject) という風に呼び出されるためです。 raise_error をテストするためには expect { subject } という風にブロックで呼び出す必要が有ります。

回避方法

このような場合、subjectproc を返すようにすると上手く動作します。

context "test" do
    subject { -> { raise RuntimeError } }
    it { is_expected.to raise_error(RuntimeError) }
end

素直に expect { subject } を呼び出すメソッドがほしいですねえ。

参照

github.com

Vim 7.4.2244 で :filter コマンドが追加された

Vim 7.4.2244 で :filter コマンドが追加されました。
これは :filt[er] /{pat}/ {command} という風に使用でき、{command} の出力結果を {pat} でフィルタリングして出力されます。

" oldfiles で .vim ファイルのみを出力する
filter /.vim$/ oldfiles

ちょっとフィルタリングしたい場合に便利そう。
ただし、:echo の出力の場合はフィルタリングされない模様。

Vim でタイマーを一時停止する

気がついたら Vim 7.4.2180 で timer_pause() なるものが追加されていました。 これは、任意の Timer を一時停止たり再開したりすることが出来ます。

" 一時停止
call timer_pause(timer, 1)

" 再開
call timer_pause(timer, 0)

[ストップウォッチ]

と、言うことで簡単なストップウォッチをつくってみた

function! Start()
    let counter = 0
    let timer = timer_start(1000, { -> [execute("let counter += 1 | echo counter", ""), counter]}, { "repeat" : -1 })

    function! Pause() closure
        call timer_pause(timer, 1)
    endfunction

    function! Restart() closure
        call timer_pause(timer, 0)
    endfunction
endfunction

Vim script 進化しまくり。

Vim script で lambda を使用する際の注意

と、いうことなので次のような lambda も上手く動作しません。

function! s:main()
    let value = 2

    let F = { xs -> filter(xs, "v:val % value == 0") }
   " Error: E121: 未定義の変数です: value
    echo F(range(1, 10))

    let F = { xs -> filter(xs, "v:val + value") }
   " Error: E121: 未定義の変数です: value
    echo F(range(1, 10))
endfunction
call s:main()

明示的に変数を指定してキャプチャする機能がほしくなりますね。

Vim 7.4.2268 でインクリメンタルサーチ時に移動するキーが <C-p>/<C-n> から <C-t>/<C-g> に変更された

[関連]

secret-garden.hatenablog.com

Vim 7.4.2259 でインクリメンタルサーチ中にマッチ位置を起動する機能が追加されたんですが、既存のキーの挙動を破壊していたため別のキーに割り当てられました。

[Vim 7.4.2268 からの挙動]

Vim 7.4.2268 では、

  • <C-t> で前のマッチ
  • <C-g> で次のマッチ

というような挙動になり、<C-n><C-p> は以前の挙動(検索履歴の移動)に戻りました。

Vim 7.4.2259 でインクリメンタルサーチ中にマッチ位置を移動する機能が追加された

[追記]

Vim 7.4.2268 で挙動が変わりました。

secret-garden.hatenablog.com

Vim 7.4.2259 で 'incsearch' を有効にして検索(/)した際にマッチした単語の位置を移動する機能が実装されました。

github.com

これにより

  • <C-p> で前のマッチ
  • <C-n> で次のマッチ

にカーソルを移動することが出来ます。

[注意]

これにより <C-p>/<C-n> の挙動が変更されたため、それ以前の『検索履歴を移動する』という機能が使えなくなりました。
もし『検索履歴を移動する』という機能を使用したいのであれば 'incsearch' を無効にすることで以前のような挙動を行うことが出来ます。

set noincsearch

Ruby 2.3 の Numeric#positive? と Numeric#negative?

Ruby 2.3 から Numeric#positive?Numeric#negative? が追加されました。
これはそれぞれ self > 0self < 0 を返します。

p  42.positive?
# => true
p -42.positive?
# => fasle
p  42.negative?
# => false
p -42.negative?
# => true
p 0.positive?
# => false
p 0.negative?
# => false

Rubocop では Ruby 2.3 を使ってると value > 0value.positive? を使えと怒られます。