'auto' 宣言の型を調べるプラグイン作った powered by momonga.vim #2.2

2/1 から 2/2 にかけて開催された @supermomonga さん主催の momonga.vim 2.2 に参加しました. 少人数でぐだぐだ雑談しながら作業する感じの会です. clang-type-inspector.vim つくった C++11 から auto を指定することで変数宣言の型を推論させることがで…

ジェネリックラムダをもっと手軽に書くためのマクロ

C++

ラムダのキャプチャは無くてはならないものだけれど,たいていの場合は [&] とかで済んでしまう.また,引数の型もジェネリックラムダの登場で,だいたい auto で済んでしまうようになったので,こんな感じで書けると良いなぁと思うようになった. std::vect…

C++14 の変数テンプレートで ::value を省く

C++

C++11 で template alias が入ったことにより,テンプレートメタプログラミングでよく出てくる,メタ関数を評価するための typename ::type を省略して直接型を取得するようなエイリアスが書けるようになりました. template<bool B, class T> using enable_if_ = typename st</bool>…

同じ CXString に複数回 clang_getCString() を適用してはいけない…?

CXString は libclang での文字列型で,C の文字列に直すには clang_getCString() を使う. CXString s = clang_getCursorSpelling(cursor); char const* p = clang_getCString(s); しかし,どうやら複数回 clang_getCString() を適用すると1回目と2回目では…

クラススコープの変数テンプレート

C++

クラススコープでは,変数テンプレートは静的なメンバ変数でしか使えない. struct X { // OK template<class T> static T hoge = T{}; // NG template<class T> T huga = T{}; }; なので,オブジェクトごとにメンバ変数テンプレートを持つということはできない. 少なくとも現</class></class>…

codic-vim 用の unite.vim ソースを書いた

Vim

codic-vim-with-unite は deprecated になりました.unite-codic.vim に移行をお願いします. ソフトウェア開発者用の辞書サービス Codic の辞書を Vim から使える codic-vim が公開されました. 日本語で単語を指定すると,それに近い英単語を一覧で出して…

Boost.Variant が特定の型の値を保持していた時だけ処理を実行する

boost::variant が保持している値の型が特定の型の場合だけ○○するという処理が多いの,でラムダ式で処理を書けるようにした. apply<{期待する variant が保持する値の型}>({variant な変数}, {適用したい関数}) という感じに使う. #include <boost/variant/variant.hpp> #include <iostream> int</iostream></boost/variant/variant.hpp>…

Boost.Variant に型指定でアクセスしたい

boost::variant の要素にアクセスする場合,which() メンバ関数で boost::variant が保持している値の型を見てからアクセスするか static_visitor でアクセスするかの二択が普通だと思うけれど,「which() でアクセスするのはマジックナンバー増えるから嫌」…

boost::variant の型パラメータ数制限をオーバーした時の対処

boost::variant はテンプレートに書ける型の数がデフォルトで 20 に制限されている.この値は variant_fwd.hpp に定義されている BOOST_VARIANT_LIMIT_TYPES マクロで確認できる. 今回は制限の 20 を超える数の型を boost::variant に指定したくなったので…

2013年に書いた Vim プラグインその他まとめ

今年書いた Vim プラグインその他をリストアップしてみた. Vim プラグイン clever-split.vim 現在のウィンドウの縦幅や横幅,開くバッファの最大の桁数などを考慮して縦分割・横分割・新規タブの中から開き方を賢く選択肢てくれるプラグイン conflict-marke…

Boost.MPL で条件の分岐先の評価を遅延したい

Boost.MPL でテンプレートの評価を遅延するやり方が分かっていなかったので調べてみたメモ. 具体例で書く. ある正数からその正数以下の連番文字列を作り出すメタ関数を考える.例えば,5 を入力すると "12345" が得られるものとする.面倒くさいので,入力…

Boost.Spirit.Qi と Boost.Variant で簡単な電卓つくった

Boost.Spirit.Qi は今まで parse() とか phrase_parse() に直接パーサを渡すだけで簡単にパースできる場合にしか使っていなかったので,真面目に文法を定義してパースしてみた. 作ったのは,四則演算と括弧と対数関数と指数関数が使える簡単な電卓. Boost.…

Travis CI で最新の Clang (3.5) を使ってテストする

Travis CI は Github アカウントと連携してリポジトリに .travis.yml というファイルを置くことで Github に push したときに自動でテストを回して CI してくれるサービス. Travis で使われている Ubuntu 12.04 に入っているコンパイラは gcc 4.6 と clang …

(進捗あります!✧\\٩(‘ω’)و //✧)o 。('、3)_ヽ)_

この記事は 進捗 Advent Calendar の 13 日目の記事となります. 年も暮れて1年の振り返りをする時期になってきたので,今年を振り返るのも兼ねて参加してみました. 進捗どうですか? → Vim 今年は Vim のプラグインをたくさん書いた気がします.ざっと数え…

Vim で C++ を書くときの逆引きリファレンス

この記事は C++ AdventCalendar 2013 の 10 日目の記事です. 本記事では Vim で C++ を書いている人を対象として,逆引きで Vim の機能やプラグインについて紹介していきます. すべてについて細かく書いているとキリが無いので,基本的な使い方とプラグイ…

無数のパッチを組み合わせて君だけの MacVim を作ろう!

Vim

この記事は Vim Advent Calendar 2013 の 9 日目の記事です. 昨日は id:daisuzu さんの Fabricで最新のVimをバラまく でした.僕はサーバでの Vim で自前の環境使うのは諦めているので,すごいなぁと感心するばかりです. 先日開催された VimConf2013 にて…

VimConf 2013 で発表してきた

vim

クックパッドで開催された Vim Conference 2013 に参加してきた. 発表 How to suggest new features for Vim (香り屋さん) いかにして取り込まれやすいパッチを書くかという話だった.基本的に Vim の方針(Vim is a text editor)に反するものは取り込まれ…

コマンドオプションを解析するライブラリ Vital.OptionParser を書いた

Vim

この記事はVim AdventCalendar 2012の 343 日目の記事です. 昨日は cohama さんの Vim で Ruby の def end とかを自動入力する vim-endwise を vim-smartinput で実装してみた でした. そろそろ終わりが見えてきて,僕が投稿するのもこれが最後な気がしま…

Momonga.vim #2 に行ってきた

vim

title: Momonga.vim #2 date: 2013-10-16 21:02 tags: [vim, momongavim, 2] categories: [vim] 書き留め 昼食 thinca さん達と食べる予定をしていたのに遅延してきた特別快速を1つ前に来る快速と勘違いして乗ってしまいあえなく遅刻,1人で食べることに… 本…

Mac で HappyHackingKeyboard Pro 2 を使う

デスクトップ欲しいなぁと思っていたので先日 iMac を購入したけれど,ワイヤレスキーボードがイマイチだったので Happy Hacking Keyboard にすることにした. 打ちやすいし余計なキーとか無いので良いけれど,若干自分好みに設定しないといけなかったのでメ…

clever-f.vim でカーソルの横移動を便利にする

Vim

この記事はVim Advent Calendar 2012 291 日目の記事になります.徐々に気温も秋らしくなり,終わりが見えてきてますね. この記事では,Vim の f キーを拡張する clever-f.vim というプラグインを紹介します. 今まで tekkoc さんや thinca さんに紹介して…

tmux で一時的に pane を最大化する

Vim には,分割しているウィンドウのうちカーソルが居るカレントウィンドウを除いて他を閉じる :only というコマンドがあります.それを拡張して,一時的にカレントウィンドウを最大化し,最大化前に戻せる ZoomWin というプラグインがあり,愛用しています…

clever-f.vim が VimL の Weekly trending repositories on Github に入った

Vim

Vim の f キーを拡張するプラグイン,clever-f.vim が Github の Trending repositories(VimL) に入っていたので記念カキコ.挙動をカスタマイズできるようにしたり migemo 的な拡張を入れたりしてコミットが活発だったからだろうか. 追記(9/8): Monthly t…

C や C++ のコードを自動で整形する clang-format を Vim で

この記事は Vim Advent Calendar 269 日目の記事になります. きつねさんとおぼえる!Clang という本を読んでいて,clang 周りで色々役立ちそうなツールがあることを知ったので,その中でも C や C++ のソースコードを整形する clang-format というツールの …

caw.vim 用のオペレータマッピング

Vim

コメントアウト用のオペレータマッピングが欲しかったので,caw.vim から tcomment_vim に乗り換えようと思ったけれど,tcomment_vim が色々いまいちだったので結局 caw.vim に戻ってオペレータマッピングは自前で定義することにした. https://github.com/r…

neocomplcache から neocomplete.vim へ乗り換える

Vim

現在 neocomplcache は開発が neocomplete.vim へと移っており,保守のみが行われている状態です.しかし,neocomplcache は結構細かく設定していたりして移行に手間取りそうで二の足を踏んでいる人も多いのではないでしょうか.僕もそうだったのですが,今…

C++ のソースコードの中に犬の顔文字が現れうることに気づいた

C++

int main() { (U'ω'); return 0; } このコードを g++ でコンパイルすると,件の行で statement has no effect と警告が出る.けれど実際は,プログラマを癒やす効果があるのでこの警告はコンパイラのバグだと思う.バグ報告したい.

Travis CI で Vim プラグインのテストを自動化する

最近 Vim 界でも続々とテストフレームワークプラグインが出てきており,自分もぼちぼち kana さん作の vim-vspec でテストを書いたりしている. 最近,Travis CI で C++ なリポジトリのテストを自動化した ので,ついでに Vim プラグインのほうも自動化して…

Travis CI で最新の gcc を使って自動テスト

Travis CI にある gcc は現在 4.6 で,普通に使う分には申し分ないけれど,最新の C++ の機能を使っている場合,最新の gcc や clang でテストを実行する必要がある場合がある. Travis CI の VM は Ubuntu らしく,最新の gcc を利用したければ自分で apt …

Homebrew で最新の libc++ と clang をビルドする

追記(9/23) homebrew-versions に llvm34 というフォーミュラが入っているので,公式に最新の LLVM を入れるには,このフォーミュラを使ったほうが良い.このフォーミュラを使うと,インストールはサンドボックスの中に行われ,システムの clang と衝突しな…

続・文字型の可変長パラメータ引数を使ってコンパイル時に文字列を生成する

C++

char 型の可変長パラメータ引数を使ってコンパイル時に文字列を生成する の続き. まず,ワイド文字を全く考えていなかったので,std::basic_string のように文字型をテンプレートにしてみた. template< class CharT, CharT... Chars > struct basic_string…

テンプレートの部分特殊化の引数リストにかかる制約

C++

昨日文字列を表す型を書いていて,このコードがエラーになるのが引っかかった. template<class T, T... CS> struct S{}; template<int I, class T> struct X1; template<class T, T C, T... CS> struct X1<0, S<T, C, CS...>>{}; template<class T, int I, T... CS> struct X1<I, S<T, CS...>>{}; template<int I, class T> struct X2; template</int></i,></class></t,></class></int></class>

char 型の可変長パラメータ引数を使ってコンパイル時に文字列を生成する

C++

C++11 から可変長のテンプレート引数を取ることが出来るようになったので, template< char... Chars > struct string {}; というクラステンプレートをつくって文字列を可変長パラメータパックに突っ込むことを考えてみた. 例えば,"moudameda" という文字…

Mac で最新の安定版 Vim (7.3.969)をインストールする

この記事の内容は deprecated です. 現在,Vim はパッチレベル 969 までが安定版,それ以降を開発版として開発が進められています. Mac で最新の開発版のパッチを適用した MacVim を使用したければ,Homebrew で macvim の HEAD を入れると簡単です. $ br…

non-static data member initializer と初期化子リストの優先度

C++

C++11 からデータメンバ宣言場所で非静的メンバの初期化が出来るようになりましたが,この初期化は初期化子リストによる初期化が省略されたときのみ行われます. #include <iostream> struct X{ int const i = 42; X(){} // 初期化子リスト無し X(char) : i(-42){} // </iostream>…

一時ウィンドウを手軽に出し入れできる tmpwin.vim を作った

Vim

この記事は Vim アドベントカレンダー 183 日目の記事です. 早いもので,始まってからもう半年になりますね. ちなみに昨日の記事は manga-osyo さんの Vim Advent Calendar 2012 中間発表 でした. 本記事では,一時ウィンドウを簡単に開いたり閉じたりで…

TokyoVim #14 に参加して git-messenger.vim を作ってみた

もう一週間も前ですが,TokyoVim #14 に参加して来ました. この4月に東京に来てからこういうコミュニティは初参加です. 最近 Vim script を書いていなかったので,とりあえず何か書きたいと思って,git-messenger.vimというプラグインを書きました. git-m…

unlet でリストの要素を削除できる

Vim

unlet は変数の定義を削除するだけでなく,配列の要素の削除に使えると知ったのでメモ. 具体的には次のように使える let a = [1, 2, 3, 4, 5] unlet a[2] echo a " => [1, 2, 4, 5] let b = [1, 2, 3, 4, 5] unlet b[2:-2] echo b " => [1, 2, 5] まだまだ …

type_traits と tuple を使ってコンパイル時 FizzBuzz

C++

#include <iostream> #include <type_traits> #include <tuple> struct fizz{ static char const value[ ]; }; char const fizz::value[ ] = "fizz"; struct buzz{ static char const value[ ]; }; char const buzz::value[ ] = "buzz"; struct fizzbuzz{ static char const value[ ]; }; c</tuple></type_traits></iostream>…

メモ化された手続きを簡単に記述できるモジュールを書いてみた

Hash でお手軽にメモ化 で書いた Hash を用いたメモ化が結構気に入ったので,メタプログラミングの練習がてら,もう少し簡単にわかりやすく書けるモジュールを作ってみた. こんな風に使える. # ブロックを与えて呼び出すと,Memo のスコープ内にブロックで…

「constexpr 長いねん」に対するエディタ的回答

autocmd FileType cpp \ inoremap <expr> e getline('.')[col('.')-6:col('.')-2] ==# 'const' ? 'expr ' : 'e' これで conste まで打つと自動で constexpr に展開されるので,const とほとんど同じ手間で constexpr と打てる!やった!</expr>

Hash でお手軽にメモ化

しつこく Hub を読む Hash#new に2引数のブロックを渡すと,存在しないキーにアクセスしようとするとそのブロックが呼ばれるようにできることは前から知っていたけれど,それをキャッシュに利用できるのは知らなかった. まず,Hash#new はこんな感じで使え…

今年作った Vim プラグイン

Vim

unite-ruby-require.vim Ruby の require のパスを絞り込み検索する unite.vim ソース. clever-f.vim f マッピングの拡張.; ではなく f だけで繰り返し移動できるようになる. inu-snippets neosnippet 用の自作スニペット. accelerated-jk j と k の移動…

「立て!立つんだビムー!」

vim

この記事は Vim アドベントカレンダー 2012 の 19 日目の記事です. 昨日はhrsh7th さんの vim-versions についての記事 でした. たくさんプラグインを入れたり設定を書いたりしていると Vim の立ち上がりはどんどん遅くなってしまいます. 一度 Vim を立ち…

Vim で Ruby を書くためのプラグイン3つ書いた

そういえば,Qiita の Ruby アドベントカレンダーで記事を書いた. Vim で Ruby を書くためのプラグイン3つ書いた

ベルヌーイ数を求める関数を少し高速化する

エイダの誕生日らしいのでベルヌーイ数を求めるプログラムを書いてみた 前回のエントリでベルヌーイ数を馬鹿正直に求めるプログラムを書いた.正しく動くけど,20番目あたりからかなり計算に時間がかかるようになってしまった.B(n+1) を求めるのに B(n) .. …

エイダの誕生日らしいのでベルヌーイ数を求めるプログラムを書いてみた

1843 年のコンピューター先見者エイダ ラブレスを讃えて 今日はエイダ・ラブレス の誕生日らしい.彼女は世界で初めてコンピュータプログラムを書いた人物で,プログラミング言語名などで有名だけど,その世界初のプログラムがベルヌーイ数を求めるプログラ…

修士論文提出まであと…

http://deadlinetimer.com/timer/46766

Ruby 2.0 のキーワード引数を補完する neocomplcache ソースを書いた

neco-ruby-keyword-args というプラグインを作りました. neco-ruby-keyword-args Ruby 2.0 では,引数を名前で指定するキーワード引数が追加されました. 今まではハッシュを引数にすることで擬似的に名前渡しを実現していましたが,もうそんなことをする必…

neosnippet のスニペットファイルを書く上での注意点

Vim

今日の勉強会の休み時間に ujihisa さんに教えてもらったので,忘れないうちにメモ. 以前,C 言語の main 関数のスニペットに main の引数 argc と argv が常に書いてあるのが気に入らなかった(引数を1度も使わないとコンパイル時に警告を食らう)ので,下…