<?xml version="1.0" encoding="utf-8" ?>


<?xml-stylesheet href="http://d.hatena.ne.jp/osyo-manga/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/osyo-manga/rss">
<title>C++でゲームプログラミング</title>
<link>http://d.hatena.ne.jp/osyo-manga/</link>
<description>C++でゲームプログラミング</description>

<dc:creator>osyo-manga</dc:creator>
<dc:date>2013-05-24T09:23:49+09:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://d.hatena.ne.jp/osyo-manga/20130524/1369355013"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/osyo-manga/20130523/1369277803"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/osyo-manga/20130522/1369218447"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/osyo-manga/20130521/1369144286"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/osyo-manga/20130520/1369049201"/>
</rdf:Seq>
</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/osyo-manga/20130524/1369355013">
<title>[C++][boost]Boost 1.54.0 では新しいライブラリとして Log, TTI, TypeErasure が追加される</title>
<link>http://d.hatena.ne.jp/osyo-manga/20130524/1369355013</link>
<description> Version 1.54.0 - boost.org Log: Logging library, from Andrey Semashev. TTI: Type Traits Introspection library, from Edward Diener. Type Erasure: Runtime polymorphism based on concepts. ついに…！という感じですが Boost 1.54.0 では新しいライブラリとして Lo</description>

<content:encoded><![CDATA[
<div class="section">

<ul>
<li><span style="font-weight:bold;" class="deco"><a href="http://www.boost.org/users/history/version_1_54_0.html" target="_blank">Version 1.54.0 - boost.org</a></span></li>
<li><span style="font-weight:bold;" class="deco">Log:</span>

<ul>
<li>Logging library, from Andrey Semashev.</li>
</ul>
</li>
<li><span style="font-weight:bold;" class="deco">TTI:</span>

<ul>
<li>Type Traits Introspection library, from Edward Diener.</li>
</ul>
</li>
<li><span style="font-weight:bold;" class="deco">Type Erasure:</span>

<ul>
<li>Runtime polymorphism based on concepts.</li>
</ul>
</li>
</ul>
<br>

<p>ついに…！という感じですが Boost 1.54.0 では新しいライブラリとして Log, TTI, TypeErasure が追加されるようです。</p>
<p>特に TypeErasure はかなり強力なライブラリなのでリリースされるのが楽しみですね。</p>
<p>TypeErasure に関しては<span style="font-weight:bold;" class="deco"><a href="http://d.hatena.ne.jp/osyo-manga/20121202/1354456126" target="_blank">ここら辺</a></span>が参考になると思います。</p>
<p>早く使いたい。</p>
<br>

<p>ちなみに今すぐに試してみたい方は既に <span style="font-weight:bold;" class="deco"><a href="http://svn.boost.org/svn/boost/trunk/" target="_blank">svn の trunk</a></span> にアップされているのでそちらを落としてきて試してみるといいと思います。</p>
</div>
]]></content:encoded>
<dc:creator>osyo-manga</dc:creator>
<dc:date>2013-05-24T09:23:33+09:00</dc:date>
<dc:subject>C++</dc:subject>
<dc:subject>boost</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/osyo-manga/20130523/1369277803">
<title>[vim]Vim 7.3.970 以降を使用する場合はご注意を</title>
<link>http://d.hatena.ne.jp/osyo-manga/20130523/1369277803</link>
<description> vim 7.4 新正規表現エンジンのテスターを募集しています。 - vim-jp 先日、何事もなかったのように 7.3.1000 を突破したんですが、7.3.970 から新しい正規表現エンジンが導入され、それに関するバグがいくつか報告されているようです。 もし 7.3.970 以降を使用していてそれ</description>

<content:encoded><![CDATA[
<div class="section">

<ul>
<li> <span style="font-weight:bold;" class="deco"><a href="http://vim-jp.org/blog/2013/05/23/vim-7.4-want-more-testers-for-new-regexp-engine.html" target="_blank">vim 7.4 新正規表現エンジンのテスターを募集しています。 - vim-jp</a></span></li>
</ul>
<br>

<p>先日、何事もなかったのように 7.3.1000 を突破したんですが、7.3.970 から新しい正規表現エンジンが導入され、それに関するバグがいくつか報告されているようです。</p>
<p>もし 7.3.970 以降を使用していてそれっぽいバグを発見した場合、<span style="font-weight:bold;font-size:x-large;" class="deco"><a href="https://github.com/vim-jp/issues/issues/390" target="_blank">vim-jp/issues</a></span> へ報告すると喜ばれると思います。</p>
<p>詳しくは上記のサイトを参照して下さい。</p>
<br>

<p>また Windows で安定版を使用したいのであれば現時点で<span style="font-weight:bold;" class="deco"><a href="http://www.kaoriya.net/news/2013/05/19/" target="_blank"> Kaoriya 版 Vim が Vim 7.3.969 を配信している</a></span>ので心配な方はそちらを使うといいと思います。</p>
</div>
]]></content:encoded>
<dc:creator>osyo-manga</dc:creator>
<dc:date>2013-05-23T11:56:43+09:00</dc:date>
<dc:subject>vim</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/osyo-manga/20130522/1369218447">
<title>[ruby]たった3行のコードでひたすらアイドル水着画像をあつめる（Ruby と mechanize だよ）</title>
<link>http://d.hatena.ne.jp/osyo-manga/20130522/1369218447</link>
<description> せっかくなので mechanize を使って書いてみました。 [ソース] require &#34;mechanize&#34; url = &#34;http://matome.naver.jp/odai/2135350364969742801&#34; puts Mechanize.new.get(url).images_with(:dom_class =&#62; /MTMItemThumb/).map(&#38;:node) [出力] コード</description>

<content:encoded><![CDATA[
<div class="section">
<p>せっかくなので mechanize を使って書いてみました。</p>
<br>

<h4>[ソース]</h4>
<pre class="syntax-highlight">
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">mechanize</span><span class="synSpecial">&#34;</span>
url = <span class="synSpecial">&#34;</span><span class="synConstant">http://matome.naver.jp/odai/2135350364969742801</span><span class="synSpecial">&#34;</span>
puts <span class="synIdentifier">Mechanize</span>.new.get(url).images_with(<span class="synIdentifier">:dom_class</span> =&#62; <span class="synSpecial">/</span><span class="synConstant">MTMItemThumb</span><span class="synSpecial">/</span>).map(&#38;<span class="synIdentifier">:node</span>)
</pre>

<h4>[出力]</h4>
<p><a href="http://f.hatena.ne.jp/osyo-manga/20130522192607" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/osyo-manga/20130522/20130522192607.png" alt="f:id:osyo-manga:20130522192607p:image" title="f:id:osyo-manga:20130522192607p:image" class="hatena-fotolife"></a></p>
<br>

<p>コードがすっきりしていますね。ぱねぇ。</p>
</div>
]]></content:encoded>
<dc:creator>osyo-manga</dc:creator>
<dc:date>2013-05-22T19:27:27+09:00</dc:date>
<dc:subject>ruby</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/osyo-manga/20130521/1369144286">
<title>[Git]Git で変更されている全てのファイルの一覧を列挙する</title>
<link>http://d.hatena.ne.jp/osyo-manga/20130521/1369144286</link>
<description> git で覚書。 多分こんな感じ。 $ git status -uall -s AM hoge.txt ?? foo.txt ?? test/test.txt </description>

<content:encoded><![CDATA[
<div class="section">
<p>git で覚書。</p>
<p>多分こんな感じ。</p>
<br>

<pre class="syntax-highlight">
$ git status -uall -s
AM hoge.txt
?? foo.txt
?? test/test.txt
</pre>

</div>
]]></content:encoded>
<dc:creator>osyo-manga</dc:creator>
<dc:date>2013-05-21T22:51:26+09:00</dc:date>
<dc:subject>Git</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/osyo-manga/20130520/1369049201">
<title>[vim]unite-source を作成する流れをまとめてみた</title>
<link>http://d.hatena.ne.jp/osyo-manga/20130520/1369049201</link>
<description> この記事は Vim Advent Calendar 2012 171日目の記事になります。 さて、前回の Vim Advent Calendar で iTunes のプレイリストを操作する euphoric_player.vim を公開したんですがその時に作成した unite-source の書き方なんかをまとめてみたいと思います。 [欲しい機能] </description>

<content:encoded><![CDATA[
<div class="section">
<p>この記事は <span style="font-weight:bold;" class="deco"><a href="http://atnd.org/events/33746" target="_blank">Vim Advent Calendar 2012</a></span> 171日目の記事になります。</p>
<br>

<p>さて、前回の Vim Advent Calendar で<a href="http://d.hatena.ne.jp/osyo-manga/20130512/1368370556" target="_blank"> iTunes のプレイリストを操作する euphoric_player.vim を公開</a>したんですがその時に作成した unite-source の書き方なんかをまとめてみたいと思います。</p>
<br>

<h4>[欲しい機能]</h4>

<ul>
<li><span style="font-weight:bold;" class="deco">トラック一覧の表示</span></li>
<li><span style="font-weight:bold;" class="deco">選択したトラックの再生</span></li>
<li><span style="font-weight:bold;" class="deco">並び順の変更</span></li>
<li><span style="font-weight:bold;" class="deco">表示形式の変更</span></li>
</ul>
<br>

<p>今回は euphoric_player.vim を利用して上記の機能を実装した unite-source のコードを載せっていってみたいと思います。</p>
<br>

<h4>[トラック一覧の表示]</h4>
<p>unite.vim でトラック一覧の表示を行います。</p>
<p>この機能は unite-source を使用して定義します。</p>
<br>

<pre class="syntax-highlight">
<span class="synComment">&#34; unite-source の設定を定義する</span>
<span class="synComment">&#34;</span>
<span class="synComment">&#34; 詳しい設定オプションは</span>
<span class="synComment">&#34; :help unite-source-attributes</span>
<span class="synStatement">let</span> s:<span class="synStatement">source</span> <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;tracks&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;example unite-source&#34;</span>,
<span class="synSpecial">\</span>}


<span class="synComment">&#34; unite.vim で表示される候補を返す</span>
<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.gather_candidates<span class="synStatement">(</span>args, context<span class="synStatement">)</span>
<span class="synComment">    &#34; euphoric_player#playlist() の戻り値については</span>
<span class="synComment">    &#34; :help euphoric_player#playlist()</span>
    <span class="synStatement">let</span> playlist <span class="synStatement">=</span> euphoric_player#playlist<span class="synStatement">()</span>
    <span class="synStatement">if</span> !<span class="synIdentifier">has_key</span><span class="synStatement">(</span>playlist, <span class="synConstant">&#34;tracks&#34;</span><span class="synStatement">)</span>
        <span class="synStatement">return</span> []
    <span class="synStatement">endif</span>

<span class="synComment">    &#34; トラック名だけ表示</span>
<span class="synComment">    &#34; word に設定した文字列が表示される</span>
    <span class="synStatement">return</span> <span class="synIdentifier">map</span><span class="synStatement">(</span>copy<span class="synStatement">(</span>playlist<span class="synStatement">.</span>tracks<span class="synStatement">)</span>, '{
<span class="synSpecial">\</span>       <span class="synConstant">&#34;word&#34;</span>  : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>   }'<span class="synError">)</span>
<span class="synStatement">endfunction</span>


<span class="synComment">&#34; untie.vim に source を登録</span>
<span class="synStatement">call</span> unite#define_source<span class="synStatement">(</span>s:source<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:<span class="synStatement">source</span>
</pre>

<br>

<h4>:Unite tracks</h4>
<p><a href="http://f.hatena.ne.jp/osyo-manga/20130520202043" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/osyo-manga/20130520/20130520202043.png" alt="f:id:osyo-manga:20130520202043p:image" title="f:id:osyo-manga:20130520202043p:image" class="hatena-fotolife"></a></p>
<br>

<p>これで unite.vim を起動させるとカレントのプレイリストのトラック名一覧が表示されます。</p>
<br>

<h4>[unite-source で引数を受け取る]</h4>
<p>unite.vim では、</p>
<br>

<pre class="syntax-highlight">
:Unite hoge:arg1:arg2
</pre>

<br>

<p>のようにして unite-source に引数を渡すことが出来ます。</p>
<p>これで unite-tracks にプレイリスト名を渡せるようにしてみたいと思います。</p>
<br>

<pre class="syntax-highlight">
<span class="synStatement">let</span> s:<span class="synStatement">source</span> <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;tracks&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;example unite-source&#34;</span>,
<span class="synSpecial">\</span>}


<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.gather_candidates<span class="synStatement">(</span>args, context<span class="synStatement">)</span>
<span class="synComment">    &#34; unite-source の引数は a:args にリストで保存されている</span>
<span class="synComment">    &#34; echo a:args</span>
<span class="synComment">    &#34; =&#62; ['arg1', 'arg2']</span>

<span class="synComment">    &#34; unite-source の引数をそのまま euphoric_player#playlist に渡す</span>
    <span class="synStatement">let</span> playlist <span class="synStatement">=</span> <span class="synIdentifier">call</span><span class="synStatement">(</span><span class="synConstant">&#34;euphoric_player#playlist&#34;</span>, a:args<span class="synStatement">)</span>
    <span class="synStatement">if</span> !<span class="synIdentifier">has_key</span><span class="synStatement">(</span>playlist, <span class="synConstant">&#34;tracks&#34;</span><span class="synStatement">)</span>
        <span class="synStatement">return</span> []
    <span class="synStatement">endif</span>

    <span class="synStatement">return</span> <span class="synIdentifier">map</span><span class="synStatement">(</span>copy<span class="synStatement">(</span>playlist<span class="synStatement">.</span>tracks<span class="synStatement">)</span>, '{
<span class="synSpecial">\</span>       <span class="synConstant">&#34;word&#34;</span>  : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>   }'<span class="synError">)</span>
<span class="synStatement">endfunction</span>


<span class="synStatement">call</span> unite#define_source<span class="synStatement">(</span>s:source<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:<span class="synStatement">source</span>
</pre>

<br>

<h4>:Unite tracks:{プレイリスト名}</h4>
<p><a href="http://f.hatena.ne.jp/osyo-manga/20130520202044" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/osyo-manga/20130520/20130520202044.png" alt="f:id:osyo-manga:20130520202044p:image" title="f:id:osyo-manga:20130520202044p:image" class="hatena-fotolife"></a></p>
<br>

<p>こんな感じで unite.vim の起動時にプレイリストを指定する事が出来ました。</p>
<br>

<h4>[選択したトラックを再生する]</h4>
<p>unite.vim で選択した候補に対して何かを行う場合、unite-action を定義します。</p>
<p>unite-action の定義方法はいくつかあるんですが、今回は unite-source に追加する形で定義してみたいと思います。</p>
<br>

<pre class="syntax-highlight">
<span class="synComment">&#34; action を定義する action_table を追加する</span>
<span class="synComment">&#34; :help unite-kind-attribute-action_table</span>

<span class="synComment">&#34; default_action には定義する action を設定</span>
<span class="synStatement">let</span> s:<span class="synStatement">source</span> <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;tracks&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;example unite-source&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;action_table&#34;</span> : {
<span class="synSpecial">\</span>       <span class="synConstant">&#34;play_track&#34;</span> : {
<span class="synSpecial">\</span>           <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;play&#34;</span>,
<span class="synSpecial">\</span>       }
<span class="synSpecial">\</span>   },
<span class="synSpecial">\</span>   <span class="synConstant">&#34;default_action&#34;</span> : <span class="synConstant">&#34;play_track&#34;</span>,
<span class="synSpecial">\</span>}


<span class="synComment">&#34; action が呼ばれた時の処理を定義</span>
<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.action_table.play_track.<span class="synStatement">func(</span>candidate<span class="synStatement">)</span>
<span class="synComment">    &#34; candidate には gather_candidates で設定した値が保持されている</span>
    <span class="synStatement">call</span> euphoric_player#play_track<span class="synStatement">(</span>a:candidate<span class="synStatement">.</span>action__track_name, a:candidate<span class="synStatement">.</span>action__playlist_name<span class="synStatement">)</span>
<span class="synStatement">endfunction</span>


<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.gather_candidates<span class="synStatement">(</span>args, context<span class="synStatement">)</span>
    <span class="synStatement">let</span> playlist <span class="synStatement">=</span> <span class="synIdentifier">call</span><span class="synStatement">(</span><span class="synConstant">&#34;euphoric_player#playlist&#34;</span>, a:args<span class="synStatement">)</span>
    <span class="synStatement">if</span> !<span class="synIdentifier">has_key</span><span class="synStatement">(</span>playlist, <span class="synConstant">&#34;tracks&#34;</span><span class="synStatement">)</span>
        <span class="synStatement">return</span> []
    <span class="synStatement">endif</span>

<span class="synComment">    &#34; action で必要な値を設定する</span>
<span class="synComment">    &#34; action で参照される変数名にはプレフィックスとして</span>
<span class="synComment">    &#34; action__</span>
<span class="synComment">    &#34; を使用する</span>
    <span class="synStatement">return</span> <span class="synIdentifier">map</span><span class="synStatement">(</span>copy<span class="synStatement">(</span>playlist<span class="synStatement">.</span>tracks<span class="synStatement">)</span>, '{
<span class="synSpecial">\</span>       <span class="synConstant">&#34;word&#34;</span>  : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;action__track_name&#34;</span>    : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;action__playlist_name&#34;</span> : playlist<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>   }'<span class="synError">)</span>
<span class="synStatement">endfunction</span>


<span class="synStatement">call</span> unite#define_source<span class="synStatement">(</span>s:source<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:<span class="synStatement">source</span>
</pre>

<br>

<p>これで候補を選択した場合に s:source.action_table.play_track.func が呼ばれます。</p>
<p>このように action で必要は値は gather_candidates で定義して返します。</p>
<br>

<h4>[並び順を変更する]</h4>
<p>unite.vim で表示される候補の並び順を変更する場合は unite-filter のsorter を使用します。</p>
<p>この機能は unite-source に対して予め定義しておいた sorter で並び順を設定することが出来ます。</p>
<br>

<pre class="syntax-highlight">
<span class="synComment">&#34; unite-filter を定義</span>
<span class="synComment">&#34; この機能で並び順を変更する事が出来る</span>
<span class="synStatement">let</span> s:filter <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;sorter_track_name&#34;</span>,
<span class="synSpecial">\</span>}

<span class="synStatement">function</span>! s:filter.filter<span class="synStatement">(</span>candidates, context<span class="synStatement">)</span>
<span class="synComment">    &#34; v:val.source__track.name で sort する</span>
    <span class="synStatement">return</span> unite#util#sort_by<span class="synStatement">(</span>a:candidates, <span class="synConstant">'v:val.source__track.name'</span><span class="synStatement">)</span>
<span class="synStatement">endfunction</span>

<span class="synComment">&#34; unite.vim に filter を登録</span>
<span class="synStatement">call</span> unite#define_filter<span class="synStatement">(</span>s:filter<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:filter


<span class="synComment">&#34; 別の sorter も定義してみたり</span>
<span class="synStatement">let</span> s:filter <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;sorter_track_artist&#34;</span>,
<span class="synSpecial">\</span>}

<span class="synStatement">function</span>! s:filter.filter<span class="synStatement">(</span>candidates, context<span class="synStatement">)</span>
<span class="synComment">    &#34; v:val.source__track.artist で sort</span>
    <span class="synStatement">return</span> unite#util#sort_by<span class="synStatement">(</span>a:candidates, <span class="synConstant">'v:val.source__track.artist'</span><span class="synStatement">)</span>
<span class="synStatement">endfunction</span>

<span class="synStatement">call</span> unite#define_filter<span class="synStatement">(</span>s:filter<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:filter


<span class="synStatement">let</span> s:<span class="synStatement">source</span> <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;tracks&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;example unite-source&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;action_table&#34;</span> : {
<span class="synSpecial">\</span>       <span class="synConstant">&#34;play_track&#34;</span> : {
<span class="synSpecial">\</span>           <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;play&#34;</span>,
<span class="synSpecial">\</span>       }
<span class="synSpecial">\</span>   },
<span class="synSpecial">\</span>   <span class="synConstant">&#34;default_action&#34;</span> : <span class="synConstant">&#34;play_track&#34;</span>,
<span class="synSpecial">\</span>}


<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.action_table.play_track.<span class="synStatement">func(</span>candidate<span class="synStatement">)</span>
    <span class="synStatement">call</span> euphoric_player#play_track<span class="synStatement">(</span>a:candidate<span class="synStatement">.</span>action__track_name, a:candidate<span class="synStatement">.</span>action__playlist_name<span class="synStatement">)</span>
<span class="synStatement">endfunction</span>


<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.gather_candidates<span class="synStatement">(</span>args, context<span class="synStatement">)</span>
    <span class="synStatement">let</span> playlist <span class="synStatement">=</span> <span class="synIdentifier">call</span><span class="synStatement">(</span><span class="synConstant">&#34;euphoric_player#playlist&#34;</span>, a:args<span class="synStatement">)</span>
    <span class="synStatement">if</span> !<span class="synIdentifier">has_key</span><span class="synStatement">(</span>playlist, <span class="synConstant">&#34;tracks&#34;</span><span class="synStatement">)</span>
        <span class="synStatement">return</span> []
    <span class="synStatement">endif</span>

<span class="synComment">    &#34; unite-filter で参照されるトラック情報も返す</span>
    <span class="synStatement">return</span> <span class="synIdentifier">map</span><span class="synStatement">(</span>copy<span class="synStatement">(</span>playlist<span class="synStatement">.</span>tracks<span class="synStatement">)</span>, '{
<span class="synSpecial">\</span>       <span class="synConstant">&#34;word&#34;</span>  : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;action__track_name&#34;</span>    : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;action__playlist_name&#34;</span> : playlist<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;source__track&#34;</span> : v:val,
<span class="synSpecial">\</span>   }'<span class="synError">)</span>
<span class="synStatement">endfunction</span>

<span class="synStatement">call</span> unite#define_source<span class="synStatement">(</span>s:source<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:<span class="synStatement">source</span>



<span class="synComment">&#34; unite-tracks でどの sorter を使用するのかを設定する</span>
<span class="synStatement">call</span> unite#custom_source<span class="synStatement">(</span><span class="synConstant">'tracks'</span>, <span class="synConstant">'sorters'</span>, <span class="synConstant">'sorter_track_name'</span><span class="synStatement">)</span>

<span class="synComment">&#34; 逆順にする場合</span>
<span class="synComment">&#34; call unite#custom_source('tracks', 'sorters', ['sorter_track_name', 'sorter_reverse'])</span>
</pre>

<br>

<h4>:Unite tracks</h4>
<p><a href="http://f.hatena.ne.jp/osyo-manga/20130520202045" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/osyo-manga/20130520/20130520202045.png" alt="f:id:osyo-manga:20130520202045p:image" title="f:id:osyo-manga:20130520202045p:image" class="hatena-fotolife"></a></p>
<br>

<p>こんな感じで unite-source に対してどのように sort を行うのかを設定する事が出来ます。</p>
<p>この機能を利用すれば unite-file などといった既存の unite-source も、ユーザ側で自由に sort を行うことが出来ます。</p>
<br>

<h4>[表示形式を変更する]</h4>
<p>さて、今は曲名しか表示していないのでちょっと寂しいですね。</p>
<p>表示するテキストは unite-source の "word" を変更すればいいのですが、今回は unite-filter の converter を使って表示されるテキストを変更してみたいと思います。</p>
<p>この機能を使用すれば unite-source 側のコードを変更することなく、表示されるテキストを変更する事が出来ます。</p>
<br>

<pre class="syntax-highlight">
<span class="synComment">&#34; unite-filter を定義</span>
<span class="synStatement">let</span> s:filter <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;converter_my_track&#34;</span>,
<span class="synSpecial">\</span>}


<span class="synStatement">function</span>! s:filter.filter<span class="synStatement">(</span>candidates, context<span class="synStatement">)</span>
<span class="synComment">    &#34; 候補に対して操作する</span>
<span class="synComment">    &#34; 今回は表示されるテキストを変更したいので word に対して設定する</span>
    <span class="synStatement">let</span> format <span class="synStatement">=</span> <span class="synConstant">&#34;%-30S - %-12S - %S&#34;</span>
    <span class="synStatement">for</span> candidate <span class="synStatement">in</span> a:candidates
        <span class="synStatement">let</span> track <span class="synStatement">=</span> candidate<span class="synStatement">.</span>source__track
        <span class="synStatement">let</span> candidate<span class="synStatement">.</span>word <span class="synStatement">=</span> <span class="synIdentifier">printf</span><span class="synStatement">(</span>format, track<span class="synStatement">.</span>name, track<span class="synStatement">.</span>artist, track<span class="synStatement">.</span>album<span class="synStatement">)</span>
    <span class="synStatement">endfor</span>
    <span class="synStatement">return</span> a:candidates
<span class="synStatement">endfunction</span>

<span class="synComment">&#34; unite.vim に filter を登録</span>
<span class="synStatement">call</span> unite#define_filter<span class="synStatement">(</span>s:filter<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:filter


<span class="synStatement">let</span> s:<span class="synStatement">source</span> <span class="synStatement">=</span> {
<span class="synSpecial">\</span>   <span class="synConstant">&#34;name&#34;</span> : <span class="synConstant">&#34;tracks&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;example unite-source&#34;</span>,
<span class="synSpecial">\</span>   <span class="synConstant">&#34;action_table&#34;</span> : {
<span class="synSpecial">\</span>       <span class="synConstant">&#34;play_track&#34;</span> : {
<span class="synSpecial">\</span>           <span class="synConstant">&#34;description&#34;</span> : <span class="synConstant">&#34;play&#34;</span>,
<span class="synSpecial">\</span>       }
<span class="synSpecial">\</span>   },
<span class="synSpecial">\</span>   <span class="synConstant">&#34;default_action&#34;</span> : <span class="synConstant">&#34;play_track&#34;</span>,
<span class="synSpecial">\</span>}


<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.action_table.play_track.<span class="synStatement">func(</span>candidate<span class="synStatement">)</span>
    <span class="synStatement">call</span> euphoric_player#play_track<span class="synStatement">(</span>a:candidate<span class="synStatement">.</span>action__track_name, a:candidate<span class="synStatement">.</span>action__playlist_name<span class="synStatement">)</span>
<span class="synStatement">endfunction</span>


<span class="synStatement">function</span>! s:<span class="synStatement">source</span>.gather_candidates<span class="synStatement">(</span>args, context<span class="synStatement">)</span>
    <span class="synStatement">let</span> playlist <span class="synStatement">=</span> <span class="synIdentifier">call</span><span class="synStatement">(</span><span class="synConstant">&#34;euphoric_player#playlist&#34;</span>, a:args<span class="synStatement">)</span>
    <span class="synStatement">if</span> !<span class="synIdentifier">has_key</span><span class="synStatement">(</span>playlist, <span class="synConstant">&#34;tracks&#34;</span><span class="synStatement">)</span>
        <span class="synStatement">return</span> []
    <span class="synStatement">endif</span>

<span class="synComment">    &#34; unite-filter で参照されるトラック情報も返す</span>
    <span class="synStatement">return</span> <span class="synIdentifier">map</span><span class="synStatement">(</span>copy<span class="synStatement">(</span>playlist<span class="synStatement">.</span>tracks<span class="synStatement">)</span>, '{
<span class="synSpecial">\</span>       <span class="synConstant">&#34;word&#34;</span>  : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;action__track_name&#34;</span>    : v:val<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;action__playlist_name&#34;</span> : playlist<span class="synStatement">.</span>name,
<span class="synSpecial">\</span>       <span class="synConstant">&#34;source__track&#34;</span> : v:val,
<span class="synSpecial">\</span>   }'<span class="synError">)</span>
<span class="synStatement">endfunction</span>

<span class="synStatement">call</span> unite#define_source<span class="synStatement">(</span>s:source<span class="synStatement">)</span>
<span class="synStatement">unlet</span> s:<span class="synStatement">source</span>


<span class="synComment">&#34; unite-tracks でどの converter を使用するのかを設定する</span>
<span class="synStatement">call</span> unite#custom_source<span class="synStatement">(</span><span class="synConstant">'tracks'</span>, <span class="synConstant">'converters'</span>, <span class="synConstant">'converter_my_track'</span><span class="synStatement">)</span>
</pre>

<br>

<h4>:Unite tracks</h4>
<p><a href="http://f.hatena.ne.jp/osyo-manga/20130520202046" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/osyo-manga/20130520/20130520202046.png" alt="f:id:osyo-manga:20130520202046p:image" title="f:id:osyo-manga:20130520202046p:image" class="hatena-fotolife"></a></p>
<br>

<p>こんな感じで unite-source を変更する事なく、表示テキストを自分で設定する事が出来ます。</p>
<p>これもやはり既存の unite-source の表示テキストをユーザ側で自由に変更する事が出来るので便利ですね。</p>
<br>

<p>と、いう感じでちょっとコードの量が多いのですが unite-source の作り方なんかを書いてみました。</p>
<p>unite-filter は最近使い始めた機能なんですがだいぶ強力ですね。</p>
<p>既存の unite-source に対してより使い勝手のいいものにしたいのであればぜひ unite-filter を使って見ることをおすすめします。</p>
</div>
]]></content:encoded>
<dc:creator>osyo-manga</dc:creator>
<dc:date>2013-05-20T20:26:41+09:00</dc:date>
<dc:subject>vim</dc:subject>
</item>
</rdf:RDF>
