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 …

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

Vim

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

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

Vim

気がついたら Vim 7.4.2180 で timer_pause() なるものが追加されていました。 これは、任意の Timer を一時停止たり再開したりすることが出来ます。 " 一時停止 call timer_pause(timer, 1) " 再開 call timer_pause(timer, 0) [ストップウォッチ] と、言う…

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

Vim

@pink_bangbi lambda式をパースする際に、外側のスコープにアクセスしている変数が1つでもあるかチェックしています。なければキャプチャはしません。で、文字列の中まではパースしないのでそういう動作になってしまいます。— K.Takata (@k_takata) 2016年8…

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

Vim

[関連] secret-garden.hatenablog.com Vim 7.4.2259 でインクリメンタルサーチ中にマッチ位置を起動する機能が追加されたんですが、既存のキーの挙動を破壊していたため別のキーに割り当てられました。 [Vim 7.4.2268 からの挙動] Vim 7.4.2268 では、 <C-t> で前</c-t>…

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

Vim

[追記] Vim 7.4.2268 で挙動が変わりました。 secret-garden.hatenablog.com Vim 7.4.2259 で 'incsearch' を有効にして検索(/)した際にマッチした単語の位置を移動する機能が実装されました。 github.com これにより <C-p> で前のマッチ <C-n> で次のマッチ にカーソ</c-n></c-p>…

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

Ruby 2.3 から Numeric#positive? と Numeric#negative? が追加されました。 これはそれぞれ self > 0 と self < 0 を返します。 p 42.positive? # => true p -42.positive? # => fasle p 42.negative? # => false p -42.negative? # => true p 0.positive? …

Vim script の lambda で execute() を使うとローカル変数がキャプチャされない

Vim

さて、Vim script の lambda 内でローカル変数を使用すると自動的にキャプチャが行われます。 function! s:main() let value = 42 let F = { -> value + value } echo F() " => 84 let value = -4 echo F() " => -8 endfunction call s:main() lambda 内で e…

Ruby で -"42" としたら -42 が返ってきてほしい

class String def -@ -to_i end end p -"42" # => -42 お気持ちです。

Vim script の funcref() を用いても関数の closure を使用するべきではない

Vim

タイトルがすでに結論なのですが、この前追加された funcref() を使用することで、以下のような問題を回避することが出来ます。 secret-garden.hatenablog.com function! Foo() let x = 0 function! Bar() closure let x += 1 return x endfunction " return…

Vim 7.4.2137 で funcref() が追加された

Vim

少し前なんですが Vim 7.4.2137 で任意の関数の Funcref を返す funcref() という組み込み関数が追加されました。 github.com これは、既存の function() と同じように使用することが出来ます。 function! s:plus(a, b) return a:a + a:b endfunction let s:…

std::getline を利用して任意の文字で文字列を分割する

C++

知らなかったので覚書。 [コード] #include <iostream> #include <string> #include <sstream> #include <vector> int main(){ std::string input = "homu,mami,mado"; std::istringstream iss(input); std::string str; std::vector<std::string> result; // , ごとに std::getline で文字列を読みこんでくる</std::string></vector></sstream></string></iostream>…

Vim で .vimrc を読み込まずにプラグインを使う

Vim

某所で話題になったので覚書。 vim の --cmd オプションで runtimepath にプラグインのパスを設定します。 $ vim -u NORC -N --cmd "set runtimepath+=~/.vim/bundle/ctrlp.vim" ポイントは -u に NORC を渡すとこ。 最初は NONE を渡してたんですが、NONE …

Ruby の #tap の面白い挙動

Ruby の #tap はレシーバをブロック引数に渡して、レシーバ自身を返すメソッドです。 x = 42 p x.tap{ |n| p n + n } # output: # 84 # 42 ブロック内でレシーバ自身を書き換えても書き換える前の値が返ってくる この #tap の面白い挙動なんですが、ブロック…

Ruby で実行マシンのプロセス数を取得する

Ruby 2.2.0 で Etc.#nprocessors というメソッドが追加されたのでそれを使えばよいみたい。 require "etc" p Etc.nprocessors # => 2 手元の環境だと2コアしかないのできびしい。

Vim 8.0 が 8月中にリリース予定

Vim

今朝、vim_dev の ML に告知がありました。 Vim 8 pre-announcement - vim_dev Work on Vim 8.0 is coming close to an end. I hope version 8.0 can be released in about two weeks. 約2週間後にリリース予定らしいので予定通り進めば今月中にも Vim 8.0 …

Vim でバッファ外のチルダ("~") の表示を無効にする

Vim

Vim 7.4.2213 で追加された EndOfBuffer ハイライトグループを利用してバッファ外に表示されるチルダ("~")を無効にすることが出来ます。 [表示あり] [表示なし] highlight link EndOfBuffer Ignore

Vim 7.4.2213 でバッファ外の "~" の部分のハイライトを制御する追加された

Vim

Vim 7.4.2213 で EndOfBuffer というハイライトグループが追加されました。 github.com これはバッファ外の "~" の部分のハイライトをハイライトするのに使用されます。 ここの部分 [設定例] EndOfBuffer は通常のハイライトグループと同じように使用できま…

C++ でハミング重みを求める その2

C++

前回は自分でコードを書いて求めたのですが、そもそも <bitset> 使えば簡単に求めることが出来ます。 #include <bitset> #include <iostream> int main(){ std::cout << std::bitset<32>(100).count() << std::endl; std::cout << std::bitset<32>(9859712).count() << std::endl; std:</iostream></bitset></bitset>…

C++ でハミング重みを求める

C++

chiwawa-star.hatenablog.com ここに載ってる『1からNまでの数字を2進数に変換してbit 1 をcountする』って処理をもっと簡単に出来ないのか調べてみました。 こういう『シンボル列中の 0 以外のシンボルの個数』のことをハミング重みというみたいです。 で、…

OS X 10.9/10/11 7.4.2196 がリリースされた

Vim

OS X 10.9/10/11 7.4.2196 ついこの間リリースされたばかりなんですが、また新しいのがリリースされました。 何か不具合でもあったのかな。

C++11/14 でテンプレートを使用する場面

C++

C++03 ではせいぜいクラスや関数ぐらいでしかテンプレートを使う場面はなかったのですが C++11/14 でテンプレートを使う場面が増えたのでまとめてみました。 クラステンプレート(C++11) クラスにテンプレート型を渡します。 template<typename T> struct holder{ T value</typename>…

Ruby の func [] と func[] の違い

Ruby ではメソッドの呼び出しに () を省略することができるので、次のような奇妙なコードを記述することが出来ます。 def func *ary ["homu", "mami", "mado"] end p func [1] # => ["homu", "mami", "mado"] p func[1] # => "mami" これは func [1] が func…

rbenv で gem install したコマンドが呼び出せなかった場合の対処

rbenv で Ruby を管理使用としたんですが、何故か bundle コマンドが使えませんでした。 そういう場合は以下のように rehash を使うと改善されるみたいです。 $ rbenv rehash

Vim 7.4.2170 で timer_info() が追加された

Vim

patch 7.4.2170 で timer_info() 関数が追加されました。 github.com この関数は現在実行中の timer の情報を返す関数です。 echo timer_info() " => [ " { " 'callback': function('<SNR>489_timer_handler'), " 'id': 2, " 'remaining': 420, " 'repeat': -1, "</snr>…

OS X 10.9/10/11 7.4.2173 がリリースされた

Vim

OS X 10.9/10/11 7.4.2173 リリース リリースされました。 ちょうど Mac で最新版の Vim を使いと思っていたので助かる。