2016-09-01から1ヶ月間の記事一覧

Vim 8.0 で追加された関数 funcref()

Vim

Vim 8.0 で新しく funcref() という関数が追加されました。 これは function() と同じように関数参照を取得する関数になりますが、『関数が上書きされても元の関数を呼び出す』という違いがあります。 function! Test() return "Test" endfunction let Funct…

Boost 1.62.0 がリリース

C++

最近はあまり Boost も触っていないが Boost 1.62.0 がリリースされたらしい。 今回は新しく以下の2つのライブラリが追加された。 Fiber QVM 両方共、昔から提案はされていたもののなかなか組み込まれなかったので、今回追加されたのは感情深い。

Vim 8.0 で追加された関数 exepath()

Vim 8.0 で新しく exepath() という関数が追加されました。 これは『絶対パス、相対パス、または $PATH の中に存在する場合は、そのフルパスを返す』という関数になります。 echo exepath("gvim") " => /usr/local/bin/gvim echo exepath("ruby") " => /usr/…

Vim 8.0 で追加された機能 closure

Vim

Vim 8.0 では関数に closure 機能が追加されました。 これは、関数外のローカル変数をキャプチャするための機能です。 function! s:init() let value = 0 " closure キーワードを追加することで関数外のローカル変数をキャプチャできる function! s:count() …

Vim 8.0 で追加された機能 タイマーを一時停止する

Vim

前回書き忘れたので追記。 timer_pause() を使用します。 " 一時停止 call timer_pause(timer_id, 1) " 再開 call timer_pause(timer_id, 0) これで一時的にタイマーを停止したり、任意のタイミングで再開する事が出来ます。

Vim 8.0 で追加された機能 タイマー

Vim

Vim 8.0 ではついに Vim script にタイマー機能が追加されました! この機能を使用することで処理をブロックしないで関数を呼び出すことが出来ます。 [基本的な使い方] タイマーは timer_start() 関数を使用して任意の関数を n 時間後に呼び出す事が出来ます…

Vim 8.0 で強化された機能 辞書関数

Vim

さて、以前の辞書関数は次のように call() と辞書を経由して呼び出す必要がありました。 let s:dict = { "value" : 0 } function! s:dict.up() let self.value += 1 return self.value endfunction let s:f = s:dict.up echo call(s:f, [], s:dict) " => 1 e…

RSpec で not_change マッチャを定義する

通常、Rspec で『変更されないことを検証する』場合、change マッチャを使用します。 # subject を呼び出しても hoge が変更されないことを検証する it { is_expected.not_to change{ hoge } } [not_change マッチャを定義する] 上記のコードでも問題ないの…

Ruby の ObjectSpace を利用して、オブジェクト名からクラスオブジェクトを探す

Ruby で例えば "String" という文字列からその名前のクラスオブジェクトを取得したい場合があるとします。 そういう場合は ObjectSpace から逆算して検出することができます。 # クラスオブジェクトの一覧を取得する classes =ObjectSpace.each_object(::Cla…

Vim 8.0 で追加された Vim script の機能 Lambda

Vim

Vim 8.0 ではついに Vim script に Lambda が追加されました! Lambda を定義する場合は { args -> expr } という構文を使用します。 " Lambda は関数参照を返す " epxr にはその名の通り "式" のみ書くことができる let F = { a, b -> a + b } echo F(1, 2)…

Vim 8.0 で追加された新しいシンタックス

Vim

Vim 8.0 では新しく以下の言語に対応しました。 New Syntax/Indent/FTplugin files: AVR Assembler (Avra) syntax Arduino syntax Bazel syntax and indent and ftplugin Dockerfile syntax and ftplugin Eiffel ftplugin Euphoria 3 and 4 syntax Go syntax…

Vim 8.0 で追加された機能 function() 関数

Vim

Vim 8.0 では function() 関数の引数が新たに追加されました。 [引数の束縛] function() の第二引数に第一引数に渡す関数の引数を渡すことで、引数の束縛を行うことができるようになりました。 function! Plus(a, b) return a:a + a:b endfunction " 第一引…

Vim 8.0 で追加された機能 uniq() 関数

Vim 8.0 で『配列の隣り合う同じ値の要素を削除する』uniq() 関数が追加されました。 echo uniq([1, 1, 3, 2, 2, 3, 3, 1]) " => [1, 3, 2, 3, 1] また、重複する要素をすべて削除したい場合は、 sort() と併用して使用します。 " sort() してから uniq() す…

Vim 8.0 で追加された機能 :smile

Vim

Vim 8.0 で :smile というコマンドが追加されました。 このコマンドを実行すると以下のような出力がされます。 それだけ。 [コマンドが追加された経緯] :smile コマンドは次のような経緯で追加されたらしいです。 @pink_bangbi neovim 出てきたりして空気が…

Vim 8.0 で追加された機能 EndOfBuffer ハイライトグループ

Vim

Vim 8.0 で EndOfBuffer というハイライトグループが追加されました。 これはバッファ外に表示されてる ~ の部分を制御するハイライトグループになります。 以下のようにハイライトを設定することで ~ のハイライトを無効にすることが出来ます。 highlight l…

Vim 8.0 で追加された機能 v_<C-a>/v_<C-x>

Vim

カーソル下の数字などをインクリメントする <C-a> が Visual モードでもできるようになりました。 選択した範囲の数字に対してインクリメントをすることが出来ます。 [v_g<C-a>/v_g<C-x>] これと似た機能で v_g<C-a>/v_g<C-x> というのも追加されました。 これは 1. 1. 1. 1. というよ</c-x></c-a></c-x></c-a></c-a>…

Vim 8.0 で追加された機能 'breakindent'

Vim

Vim 8.0 で 'breakindent' というオプションが追加されました。 これは、行を折り返しするときにインデントを考慮するようになるオプションになります。 [set nobreakindent] [set breakindent] 便利。

Vim 8.0 がリリース!!

Vim

ついに Vim 8.0 がリリースされました!!! https://groups.google.com/forum/#!topic/vim_dev/CmiGxtJ7fn4 Vim 7.0 がリリースされたのが 2006年5月になるので、約10年ぶりのメジャーアップデートとなります。 わたしは Vim 7.3 あたりから Vim を使い始め…

Vim 7.4.2304 で Timer のコールバック内で timer_stop() できるようになった

Vim

以前、『コールバック関数内で timer_stop() 出来ない』という問題があったんですが、Vim 7.4.2304 でこの問題が修正されました。 function! Test() let disp = { "value" : 0 } function! disp.call(...) echo self.value let self.value += 1 " 5回呼び出…

Ruby の refinements で特異メソッドを定義する時の注意

さて、次のようにクラスオブジェクトに対して特異メソッドを定義するとエラーになります。 module StringEx refine String do class << self def homu "homu" end end end end using StringEx # Error: undefined method `homu' for String:Class (NoMethodE…

Ruby で無名スコープみたいなのを記述する

C++ では {} で任意の箇所に無名スコープをつくることができます。 int value = 10; { int count = 3; // スコープの外の変数にアクセスできる value += count; } // スコープの中で定義した変数はスコープ外でアクセスはできない // value = count; Ruby の…

Ruby で動的に refine を定義する

Ruby で refinements を利用すると次のようにクラス拡張を特定の範囲でのみ適用させることができます。 module StringEx refine String do def twice self + self end end end using StringEx p "homu".twice # => "homuhomu" 上記の場合は StringEx モジュ…

Ruby でゴーストメソッド

Ruby でゴーストメソッドを書いてみた。 class X def initialize value @value = value end def method_missing name, *args @value.send name, *args end end n = X.new 42 p n + 3 p n - 4 ary = X.new [1, 2, 3] p ary.include? 2 ゴーストメソッドとは『…

Ruby で nil.to_i の戻り値

某所で聞いたので覚書。 Ruby の nil を #to_i で数値に変換すると 0 が返ってくる。 nil.to_i # => 0 そりゃそうなんだけど、Ruby で nil が 0 になるのはなんか不思議

RSpec の have_attributes マッチャ

RSpec の have_attributes マッチャは『オブジェクトの属性(プロパティ)を検証する』マッチャになります。 例えば、 it { expect(10.to_s).to eq("10") } it { expect(10.positive?).to eq(true) } というようなテストが # メソッド名と戻り値の Hash を渡…

C++ の range-based for 内で iterator を進めたい

C++

通常 range-based for を使用する場合は iterator ではなくて実体を参照するのでユーザから iterator の操作を行うことは出来ません。 ので、range-based for 内でも間接的に iterator を操作できるようなラッパーを書いてみました。 [コード] #include <vector> #in</vector>…

C++ の range-based for でループカウンタを使用する

C++

Twitter でみかけたので書いてみた。 一番簡単なのは boost::adaptors:indexed 使うのが楽っぽい。 [コード] #include <vector> #include <iostream> #include <string> #include <boost/range/adaptor/indexed.hpp> int main(){ std::vector<std::string> table = { "homu", "mami", "mado"}; for(auto&& it : table | boost::adaptor</std::string></boost/range/adaptor/indexed.hpp></string></iostream></vector>…

clang-check で -std=c++14 を使う

C++

C++14 に対して clang-check を使おうと思ったんですが $ clang-check -std=c++14 main.cpp -- clang-check: Unknown command line argument '-std=c++14'. Try: 'clang-check -help' clang-check: Did you mean '-h=c++14'? みたいに単純に -std=c++14 をつ…

Ruby の &. と #try の違い

Ruby 2.3 で Safe Navigation Operator(&.)という新しい演算子が追加されました。 これは obj&.to_i という風にメソッド呼び出しのように使い、レシーバが nil の場合に nil を返します。 10&.to_s # => "10" nil&.to_s # nil このように nil チェックするこ…

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

RSpec では subject と is_expected を利用して次のようにテストを書くことが出来ます。 context "test" do subject { 42 } # is_expected の内部で subject が呼び出される it { is_expected.to eq(42) } end raise_error を使いたかった 次のように raise …