<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vim-users.jp &#187; lv2</title>
	<atom:link href="http://vim-users.jp/tag/lv2/feed/" rel="self" type="application/rss+xml" />
	<link>http://vim-users.jp</link>
	<description>日本の Vim ユーザのためのハブサイト</description>
	<lastBuildDate>Sun, 05 Feb 2012 10:51:53 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<atom:link rel='hub' href='http://vim-users.jp/?pushpress=hub'/>
		<item>
		<title>Hack #241: Haskellで使いたい関数を使ってからそのモジュールをimportする</title>
		<link>http://vim-users.jp/2011/12/hack241/</link>
		<comments>http://vim-users.jp/2011/12/hack241/#comments</comments>
		<pubDate>Sun, 18 Dec 2011 15:00:05 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2708</guid>
		<description><![CDATA[Haskell Advent Calendar 2011への寄稿記事です。 問題 Haskellを書いていて、長いソースコードの末尾の方にて、急にとあるモジュールのとある関数を使いたい、そんなときはよくあります。ありがち [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://partake.in/events/eaea52c2-61ef-46d5-a855-3a2dde459e3a">Haskell Advent Calendar 2011</a>への寄稿記事です。</p>
				
				<h2>問題</h2>
				
				<p>Haskellを書いていて、長いソースコードの末尾の方にて、急にとあるモジュールのとある関数を使いたい、そんなときはよくあります。ありがちなのがApplicativeの演算子いくつかと、Data.Function.onと、Data.Listのアレとコレと・・・。いくらでもあります。</p>
				
				<p>Haskellでは一般的に、モジュールのimportはソースコードのかなりはじめの方にまとめて記述します。importしたい関数を一度しか使わず、しかもソースコードの末尾の方に位置していようと、おかまい無しです。このとき、<kbd>gg</kbd>などでソースコード上部まで移動し、<a href="http://vim-users.jp/2011/04/hack211/">neco-ghc</a>などを駆使してmoduleとその関数を的確にimportし、そして<kbd>&lt;C-o&gt;</kbd>などでもといた場所に戻ることになると思います。<code>:sp</code>などで画面分割してから行ったり、あるいはmarkをつけるという方法もありますが、いずれにせよこれらの作業のため脳内の作業メモリがスタックオーバーフローするのは明らかでしょう。</p>
				
				<h2>解決</h2>
				
				<p>unite-haskellimportを用います。</p>
				
				<p><a href="https://github.com/ujihisa/unite-haskellimport">https://github.com/ujihisa/unite-haskellimport</a></p>
				
				<p>まずは上記プラギンをインストールします。依存プラギンはunite.vim、依存ツールは<code>hoogle</code>です。</p>
				
				<pre><code>$ cabal update &amp;&amp; cabal install hoogle &amp;&amp; hoogle data
</code></pre>
				
				<p>たとえば急に<code>==&gt;</code>という関数を使いたくなったとしましょう。</p>
				
				<pre><code>:Unite haskellimport
</code></pre>
				
				<p>としてunite窓を開き、<code>==&gt;</code>と打鍵しましょう。</p>
				
				<pre><code>Test.QuickCheck.Property (==&gt;) :: Testable prop =&gt; Bool -&gt; prop -&gt; Property
Test.QuickCheck (==&gt;) :: Testable prop =&gt; Bool -&gt; prop -&gt; Property
</code></pre>
				
				<p>インストールしているcabalパッケージにもよりますが、たとえば上記のような項目が選択肢にでてくることでしょう。実際にimportしたい側を選択します。</p>
				
				<p>候補を選択すると、unite-haskellimportはdefaultのactionとして:Haskellimportコマンドを発行します。これは、対象を、ソースコードのそれらしい場所に挿入するものです。既に他のimport文がある場合は、最後のimportのあとに挿入します。</p>
				
				<p>Before</p>
				
				<pre><code>import qualified Data.Text as T

f x = ...
</code></pre>
				
				<p>After</p>
				
				<pre><code>import qualified Data.Text as T
import Test.QuickCheck ((==&gt;))

f x = ...
</code></pre>
				
				<p>今回importしたのは記号からなる関数でした。が、もしも記号ではない関数、つまりVimの<code>&lt;cword&gt;</code>になるようなものならば、<code>:Unite</code>のかわりに</p>
				
				<pre><code>:UniteWithCursorWord haskellimport
</code></pre>
				
				<p>とするとよいでしょう。これを頻繁に行うようならば、適切なキーにマッピングしておくべきです。たとえば以下を <code>~/.vim/ftplugin/haskell.vim</code>に記述すると、<kbd>&lt;space&gt;I</kbd>と打鍵するだけでカーソル以下にある単語の関数をimportしてくれます。</p>
				
				<pre><code>nnoremap &lt;buffer&gt; &lt;space&gt;I :&lt;C-u&gt;UniteWithCursorWord haskellimport&lt;Cr&gt;
</code></pre>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/12/hack241/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #240: &lt;C-[&gt; での誤爆を防止する</title>
		<link>http://vim-users.jp/2011/12/hack240/</link>
		<comments>http://vim-users.jp/2011/12/hack240/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 15:00:06 +0000</pubDate>
		<dc:creator>thinca</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2703</guid>
		<description><![CDATA[挿入モードから抜ける方法は多数ありますが、その中に &#60;C-[&#62; キーがあります。 しかしこの [ キーは、日本語キーボードではすぐ左に @ キーがあり、誤って &#60;C-@&#62; を押してしまうと直前に挿 [...]]]></description>
			<content:encoded><![CDATA[				<p>挿入モードから抜ける方法は多数ありますが、その中に &lt;C-[&gt; キーがあります。</p>
				
				<p>しかしこの [ キーは、日本語キーボードではすぐ左に @ キーがあり、誤って &lt;C-@&gt; を押してしまうと直前に挿入したテキストがさらに挿入されてから挿入モードを抜けるため、誤爆すると大惨事となります。</p>
				
				<h3>誤爆を防止する</h3>
				
				<p>誤爆をすると言うことは、本来行いたい操作があるということです。
				このような誤爆を簡単かつ確実に防止するには、対象の機能を本来押したいキーに置き換えてしまうのが効果的です。</p>
				
				<p>考えてみましょう。この &lt;C-@&gt; の機能「直前に挿入されたテキストをもう一度挿入し、挿入を終了する。」は、あなたにとって必要でしょうか?
				もし必要ないと判断したら、本来押したいキー、この場合は &lt;C-[&gt; に置き換えましょう。以下のようにします。</p>
				
				<pre><code>imap &lt;C-@&gt; &lt;C-[&gt;
</code></pre>
				
				<p>こうすることで誤爆を防ぐことができます。この @ は [ よりも近いため押し易く、しかもこの位置は英字キーボードと同じ位置であるため、英字キーボードに乗り換える練習にもなります。</p>
				
				<p>もし万が一 &lt;C-@&gt; の機能が使いたい場合、しかし誤爆は避けたい場合は、別の位置に &lt;C-@&gt; をマッピングするとよいでしょう。</p>
				
				<address class="hack-author">thinca</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/12/hack240/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #238: neobundle.vim で plugin をモダンに管理する</title>
		<link>http://vim-users.jp/2011/10/hack238/</link>
		<comments>http://vim-users.jp/2011/10/hack238/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 15:00:59 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neobundle.vim]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[unite]]></category>
		<category><![CDATA[Vundle]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2671</guid>
		<description><![CDATA[こんにちは。Shougoです。Vimテクニックバイブルの執筆で長らくお休みを頂いていました。 執筆が終わってからも、プラグインの更新で忙しいのが難点です。 とはいえ、あまりに間隔が空いているのは執筆者としてまずいと感じた [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは。Shougoです。Vimテクニックバイブルの執筆で長らくお休みを頂いていました。
				執筆が終わってからも、プラグインの更新で忙しいのが難点です。
				とはいえ、あまりに間隔が空いているのは執筆者としてまずいと感じたため、久しぶりに復帰します。</p>
				
				<p>みなさん、Vimプラグイン管理には何をお使いでしょうか。残念ながら、Vimのプラグイン管理には良い方法がなく、
				各々が「自分の考える最強のプラグイン管理プラグイン」を作ってきました。
				つまり、長らくプラグイン管理プラグインは戦国時代の様相を呈していたわけです。
				実装が存在しないVimJoltsもその一つです:-)。
				しかし最近、Vimのプラグイン管理はVundleに一元化されることが多くなってきました。
				<a href="http://vim-users.jp/2011/04/hack215/">「Hack #215: Vundleでプラグインをモダンに管理する」</a>やVimテクニックバイブルでも紹介されています。
				私も最初はpathogenを使っていましたが、アップデートが簡単なVundleに乗り換えた経緯があります。
				ただしVundleにもいくつか不満があったため、自分でforkしたVundleをしばらく使用していました。
				しかし、最終的にVundleの仕様変更に追随できなくなったため、forkしたVundleを元にneobundle.vimを開発することにしました。
				変更点をVundleにマージするには、変更点が多すぎたということもあります。
				今回はneobundle.vimについて紹介します。</p>
				
				<h2>neobundle.vimとVundleの違い</h2>
				
				<p>Vundleをベースにしたため、基本的な機能は同じです。
				Vundleを知っているなら、すぐに乗り換えることも可能でしょう。
				変更点は幾つかありますが、主なものは以下の通りです。</p>
				
				<h3>コマンド名が改善されている</h3>
				
				<p>VundleはBundleを意識して付けられたコマンド名になっているため、コマンド名とプラグイン名が対応していません。
				例えば、プラグインをインストールするコマンド名は<code>:VundleInstall</code>ではなく、<code>:BundleInstall</code>です。
				この辺りは、議論がされているようですが、まだ結論は出ていません。
				neobundle.vimはプラグイン名をプレフィクスとした、<code>:NeoBundleInstall</code>となっています。
				BundleをNeoBundleに改名するだけで、基本的に使用することができます。</p>
				
				<h3>vital化されている</h3>
				
				<p>ルーチンを他のプラグインと共通化するために、vital.vimを使用しています。
				プラグインの開発が楽になります。</p>
				
				<h3>shellslashがオンでも動作する</h3>
				
				<p><code>shellescape()</code>を使用していますが、shellslashオプションがオンの場合、クオートが&#8221;になってしまうという問題があります。
				つまりWindows環境で、cmd.exeをshellとして使用している場合、shellslashを有効にしていると動きません。
				neobundle.vimでは<code>shellescape()</code>を使用していません。</p>
				
				<h3>vimprocに対応している</h3>
				
				<p>vimprocが利用できる環境では、アップデートにvimprocを使用します。
				Windows環境では、DOS窓が出ないという利点につながります。</p>
				
				<h3>unite.vimインタフェースの実装</h3>
				
				<p>実は、これがneobundle.vimで一番やりたかった機能です。
				neobundle.vimはunite.vimのインタフェースを実装しているため、unite.vimからVimプラグインをアップデートすることができます。
				非同期でアップデートを行うため、使用にはvimprocが必要です。
				neobundle.vimはunite.vimやvimprocがない環境でも動作しなくてはならないため、従来のインタフェースも残っています。
				ただし、従来のインタフェースは緊急用のため重視していません。</p>
				
				<h3>Subversion, Mercurialへの対応</h3>
				
				<p>tsukkeeさんがVundleに追加していた機能をマージし、Subversion, Mercurialに試験的な対応をしました。
				まだ実験段階ですが、試していただければと思います。</p>
				
				<h3>リビジョン指定</h3>
				
				<p><code>:NeoBundle {repository} {revision}</code>という構文でリビジョン指定ができます。まだ実験段階の機能です。
				不具合のあるプラグインのバージョンを固定する時に便利だと思います。</p>
				
				<h2>neobundle.vimの導入</h2>
				
				<p>neobundle.vimの開発は、github上で行われています。<a href="https://github.com/Shougo/neobundle.vim">https://github.com/Shougo/neobundle.vim</a>
				導入する場合、~/.vimにリポジトリをcloneすると楽でしょう。</p>
				
				<pre><code>$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/neobundle.vim.git
</code></pre>
				
				<h2>plugin の管理</h2>
				
				<p>plugin の管理は以下の様に .vimrc に <code>NeoBundle 'plugin name'</code> と記述することで行います。
				極端な話、<code>Bundle</code>を<code>NeoBundle</code>に変更するだけです。</p>
				
				<pre><code>set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+='path to neobundle directory'

  call neobundle#rc(expand('~/.bundle'))
endif

NeoBundle 'git://github.com/Shougo/clang_complete.git'
NeoBundle 'git://github.com/Shougo/echodoc.git'
NeoBundle 'git://github.com/Shougo/neocomplcache.git'
NeoBundle 'git://github.com/Shougo/neobundle.vim.git'
NeoBundle 'git://github.com/Shougo/unite.vim.git'
NeoBundle 'git://github.com/Shougo/vim-vcs.git'
NeoBundle 'git://github.com/Shougo/vimfiler.git'
NeoBundle 'git://github.com/Shougo/vimshell.git'
NeoBundle 'git://github.com/Shougo/vinarise.git'

filetype plugin on
filetype indent on
</code></pre>
				
				<p>Vundleと同様、先にfiletypeをoffにしてから、neobundle.vimの設定を行います。
				最初、neobudle.vimの関数を呼べるよう、neobundle.vimのパスを<code>&amp;runtimepath</code>に追加します。
				そして<code>neobundle#rc(expand('~/.bundle'))</code>で初期化します。
				<code>neobudle#rc()</code>の引数はプラグインをインストールする基準となるパスです。
				<code>NeoBundle</code>コマンドで設定をしたあと、最後にfiletype pluginをオンにします。</p>
				
				<h2>NeoBundle コマンドの使い方</h2>
				
				<p>Vundleと全く同じです。基本的にBundleコマンドがNeoBundleコマンドに変わっただけです。</p>
				
				<h4>Github 上のリポジトリから取得する</h4>
				
				<pre><code>NeoBundle 'user_name/repository_name'
</code></pre>
				
				<h4>vim-scripts 上のリポジトリから取得する</h4>
				
				<pre><code>NeoBundle 'script_name'
</code></pre>
				
				<h4>それ以外のリポジトリから取得する</h4>
				
				<pre><code>NeoBundle 'git://repository_url'
NeoBundle 'http://svn.macports.org/repository/macports/contrib/mpvim/'
NeoBundle 'https://bitbucket.org/ns9tks/vim-fuzzyfinder'
</code></pre>
				
				<p>Gitリポジトリのフルパスを指定します。
				MercurialやSubversionにも試験的に対応しています。</p>
				
				<h2>pluginの管理</h2>
				
				<p>plugin のインストールには、<code>:NeoBundleInstall</code> コマンドを使用します。
				.vimrcで設定したplugin が自動的に取得され、インストールまで行われます。
				ただし、アップデートしたプラグインを使用するには、Vimを再起動したほうが良いです。</p>
				
				<pre><code>:NeoBundleInstall
</code></pre>
				
				<p>既にインストールされている plugin をアップデートするには、 <code>:NeoBundleInstall!</code> コマンドを利用します。
				通常の<code>NeoBundleInstall</code>では、アップデートが行われないからです。</p>
				
				<pre><code>:NeoBundleInstall!
</code></pre>
				
				<p>不要になったプラグインを削除するには、<code>:NeoBundle</code>の設定を.vimrcから削除した後、
				<code>:NeoBundleClean</code>コマンドを実行します。</p>
				
				<p>neobundle.vimはplugin検索には対応していません。</p>
				
				<p>neobudle.vimはneobundle/install sourceを使用することで、
				unite.vimインタフェースによりアップデートを行うことができます。
				アップデートは非同期に行われます。
				neobundle/install sourceの引数に!を与えると、<code>:NeoBundleInstall!</code>相当になります。
				プラグイン名を引数に与えることで、個別にアップデートをすることも可能です。</p>
				
				<pre><code>:Unite neobundle/install:!
:Unite neobundle/install:neocomplcache
:Unite neobundle/install:neocomplcache:unite.vim
</code></pre>
				
				<h2>ドキュメントの更新</h2>
				
				<p>プラグインのインストール時に、自動的に<code>:helptags</code>コマンドが実行されるため、
				ユーザーは何もする必要がありません。</p>
				
				<h2>参考</h2>
				
				<ul>
				<li>:help neobundle</li>
				</ul>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/10/hack238/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hack #237: 古い quickfix を参照する</title>
		<link>http://vim-users.jp/2011/10/hack237/</link>
		<comments>http://vim-users.jp/2011/10/hack237/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 15:00:44 +0000</pubDate>
		<dc:creator>thinca</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2664</guid>
		<description><![CDATA[quickfix は :grep や :make の結果として使われたり、時にはプラグインが何かの結果を表示するのに使ったりと、様々な状況で使用されます。 それだけ便利なものですが、時には、以前の内容をまだ見たいのにうっ [...]]]></description>
			<content:encoded><![CDATA[				<p>quickfix は <code>:grep</code> や <code>:make</code> の結果として使われたり、時にはプラグインが何かの結果を表示するのに使ったりと、様々な状況で使用されます。</p>
				
				<p>それだけ便利なものですが、時には、以前の内容をまだ見たいのにうっかり新しい内容を quickfix へ出力してしまうことがあります。</p>
				
				<h3><code>:colder</code> <code>:cnewer</code> コマンド</h3>
				
				<p>実は、quickfix は過去のリストを10個まで保持しています。これは <code>:colder</code> <code>:cnewer</code> コマンドで切り替えられます。</p>
				
				<pre><code>:colder [count]
:cnewer [count]
</code></pre>
				
				<p><code>:colder</code> で <code>[count]</code> 個分古い quickfix へ移動します。<code>:cnewer</code> で <code>[count]</code> 個分新しい quickfix へ移動します。</p>
				
				<p>もし誤って quickfix を上書きしてしまった場合でも、慌てず騒がず <code>:colder</code> すれば安心です。</p>
				
				<address class="hack-author">thinca</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/10/hack237/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #235: リストの要素の総和や総乗を簡単に求める</title>
		<link>http://vim-users.jp/2011/10/hack235/</link>
		<comments>http://vim-users.jp/2011/10/hack235/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 15:00:56 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2659</guid>
		<description><![CDATA[こんにちは、ujihisaです。無事引っ越しが完了しましたが、インターネット回線の確保にはもうしばらく時間がかかるらしく、しばらく家でオフラインな状態です。ちなみに来日することが決まりました。こんなカンファレンスや、勉強 [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、ujihisaです。無事引っ越しが完了しましたが、インターネット回線の確保にはもうしばらく時間がかかるらしく、しばらく家でオフラインな状態です。ちなみに来日することが決まりました。<a href="http://atnd.org/events/20567">こんな</a>カンファレンスや、<a href="http://cotocoto.jp/event/46351">勉強会</a>を企画してみました。いずれも来月です。ふるってプレゼンに応募ください。</p>
				
				<h2>問題</h2>
				
				<p>リスト<code>list</code>の和は、他の言語ならば以下のようにして求めることが一般的です。</p>
				
				<ul>
				  <li>Ruby
				    <ul>
				      <li><code>list.inject(:+)</code></li>
				      <li>これは <code>list.inject {|i, j| i + j }</code>の意。<code>Enumerable#inject</code>の特殊用法</li>
				      <li><code>list.inject(0, :+)</code></li>
				      <li>同じくこれは <code>list.inject(0) {|i, j| i + j }</code>の意。</li>
				    </ul>
				  </li>
				  <li>Haskell
				    <ul>
				      <li><code>foldl1 (+) list</code></li>
				      <li>これは<code>foldl1 (\i j -&gt; i + j) list</code>の意。言語仕様として演算子は括弧でくくるだけで2引数関数のような振る舞いになる(*1)。</li>
				      <li><code>sum list</code></li>
				    </ul>
				  </li>
				  <li>Python
				    <ul>
				      <li><code>reduce(lambda a, b: a + b, list)</code></li>
				      <li><code>sum(list)</code>
				と、<code>sum</code>といった直接的な方法がサポートされているかは別にして、なんらかの「リストと関数を受け取り、(リストに限らない)なんらかの値を返す」関数が提供されるのが一般的であることがわかります。</li>
				    </ul>
				  </li>
				</ul>
				
				<p>Vim scriptには残念ながらそういった関数が標準では提供されていないようです。どうすればよいでしょうか。</p>
				
				<h2>解決</h2>
				
				<p>vital.vimという、プラギン埋め込み型の汎用ライブラリを使います。</p>
				
				<ul>
				  <li><a href="https://github.com/ujihisa/vital.vim">https://github.com/ujihisa/vital.vim</a></li>
				  <li><a href="http://d.hatena.ne.jp/thinca/20110310/1299768323">http://d.hatena.ne.jp/thinca/20110310/1299768323</a></li>
				</ul>
				
				<p>前述の問題を解決するには、vitalのData.Listモジュールを用いるのがよいでしょう。Data.Listの上記要件を満たす関数は以下の4つで、意味はそれぞれHaskellのPreludeに定義されているものと同じです。</p>
				
				<ul>
				  <li>foldl</li>
				  <li>foldl1</li>
				  <li>foldr</li>
				  <li>foldr1</li>
				</ul>
				
				<p>たとえば<code>foldl1</code>を用いると、以下のようにしてリストlistの要素の値の総和を求めることができます。</p>
				
				<pre><code>let L = vital#of('プラギン名').import('Data.List')
echo L.foldl1('v:memo + v:val', list)
</code></pre>
				
				<p>非常に書きやすく読みやすく、理想的です。なお、実験的にvitalを用いる場合は、vitalを<code>&amp;rtp</code>に入れた上で<code>vital#of('vital')</code>とするとそのvitalを読み込むことができます。</p>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/10/hack235/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #232: Clojure開発環境を整える</title>
		<link>http://vim-users.jp/2011/09/hack232/</link>
		<comments>http://vim-users.jp/2011/09/hack232/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 15:00:37 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2644</guid>
		<description><![CDATA[こんにちは、ujihisaです。Vancouverでは空前のClojureブームが発生しており、毎週のようにClojure勉強会があり、Vim使いやEmacs使いが集結しています。 問題1 Clojureでシンタックスハ [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、ujihisaです。Vancouverでは空前のClojureブームが発生しており、毎週のようにClojure勉強会があり、Vim使いやEmacs使いが集結しています。</p>
				
				<h2>問題1</h2>
				
				<p>Clojureでシンタックスハイライトや自動インデントを行いたい。</p>
				
				<h2>解決1</h2>
				
				<p>VimClojureというプラギンをインストールします。</p>
				
				<p><a href="https://github.com/jondistad/vimclojure">https://github.com/jondistad/vimclojure</a></p>
				
				<p>なお、<code>g:clj_highlight_builtins</code>を設定すると標準関数のハイライトが、また<code>g:clj_paren_rainbow</code>を設定すると括弧の対応が虹色に美しく輝き、便利です。筆者は以下のようにして両方とも利用可能にしています。</p>
				
				<p><code>~/.vimrc</code>:</p>
				
				<pre><code>let g:clj_highlight_builtins = 1
let g:clj_paren_rainbow = 1
</code></pre>
				
				<p><img src="http://cache.gyazo.com/b06a1ebce88f8e4185758a1439ba617c.png" alt="vimclojure highlighting" /></p>
				
				<h2>問題2</h2>
				
				<p>改行するたびにyankしている文字列が消える?</p>
				
				<h2>解決2</h2>
				
				<p>VimClojureをアンインストールするか、頑張ってパッチを書きます。</p>
				
				<p>VimClojureには深刻なバグがあり、インデントを調整するたびにyankしている文字列が完全に破壊されます。</p>
				
				<h2>問題3</h2>
				
				<p>Clojureのコードを即座に実行し、結果を別バッファに表示しつづけたい。</p>
				
				<h2>解決3</h2>
				
				<p>quickrunを用います。もし<code>clj</code>というコマンドを持っていれば、ファイルタイプがclojureであるバッファに対してquickrunは無設定で動作します。</p>
				
				<p><a href="https://github.com/thinca/vim-quickrun">https://github.com/thinca/vim-quickrun</a></p>
				
				<p><img src="http://cache.gyazo.com/c75140516995cd5ccfb6593584bc7af4.png" alt="quickrun clj" /></p>
				
				<h2>問題4</h2>
				
				<p>quickrunに時間がかかりすぎる。</p>
				
				<h2>解決4</h2>
				
				<p>JVMの立ち上げ時間とライブラリの読み込み時間がとても長いのが原因です。Clojure処理系を立ち上げたままにしておくことで、劇的な高速化が実現できます。そのための道具としてNailGunとJarkがあります。筆者のオススメはJarkです。</p>
				
				<p><a href="https://github.com/icylisper/jark">https://github.com/icylisper/jark</a></p>
				
				<p>Jarkをインストールしたら、まずはJarkサーバを立ち上げましょう。vimshellなどで</p>
				
				<pre><code>$ jark vm start
</code></pre>
				
				<p>として事前にJarkサーバを立ち上げ、そしてquickrunします。OSを終了するときまで、すなわちVimを終了するときまで、Jarkサーバを終了する必要はありません。</p>
				
				<p>quickrunは<a href="https://github.com/thinca/vim-quickrun/pull/18">既にjarkに対応していますので</a>、無設定でいきなり使えるはずです。</p>
				
				<p>以下に感動的なベンチマーク結果を載せます。</p>
				
				<pre><code>(println "hello")
</code></pre>
				
				<p>とだけ書いたコードを<code>clj</code>と<code>jark</code>のそれぞれで<code>time</code>コマンドで比較してみたところ、それぞれ</p>
				
				<ul>
				  <li>
				    <p>clj</p>
				
				    <pre><code>  1.40 real         2.09 user         0.15 sys
</code></pre>
				  </li>
				  <li>
				    <p>jark</p>
				
				    <pre><code>  0.19 real         0.11 user         0.06 sys
</code></pre>
				  </li>
				</ul>
				
				<p>となりました。実験はかなりパワフルなiMacを用いて行ったので、一般的な初代MacBook Airなどのマシンで行うと、さらに顕著な差が出るでしょう。</p>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/09/hack232/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Hack #231: Rubyで入力と出力からメソッド名を自動補完する</title>
		<link>http://vim-users.jp/2011/09/hack231/</link>
		<comments>http://vim-users.jp/2011/09/hack231/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 15:00:30 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2641</guid>
		<description><![CDATA[こんにちは、ujihisaです。社内Hackathonがあるということで土日に出社したものの、どちらも僕以外全員不参加で涙目でした。 問題 Rubyでメソッド名を補完する方法をHack #229: 動的型付け言語Ruby [...]]]></description>
			<content:encoded><![CDATA[				<p>こんにちは、ujihisaです。社内Hackathonがあるということで土日に出社したものの、どちらも僕以外全員不参加で涙目でした。</p>
				
				<h2>問題</h2>
				
				<p>Rubyでメソッド名を補完する方法を<a href="http://vim-users.jp/2011/09/hack229/">Hack #229: 動的型付け言語Rubyでメソッド名などを自動補完する</a>で紹介しました。これは、オブジェクトからそのメソッドをすべて網羅することで補完を行うというアプローチでした。</p>
				
				<p>では、オブジェクトと、メソッドを呼び出すことで得られる返り値の両方から補完を行うことはできないのでしょうか。</p>
				
				<p>例示します。Rubyでは、1というオブジェクトから2というオブジェクトを得るには、1に対して<code>succ</code>または<code>next</code>というメソッドを呼び出すことで実現できます。</p>
				
				<pre><code>1.succ #=&gt; 2
</code></pre>
				
				<p>また、<code>[:a, :b, :c]</code>というオブジェクトから<code>:a</code>というオブジェクトを得るには、<code>[:a, :b, :c]</code>というオブジェクトに<code>first</code>などのメソッドを呼び出すことで実現できます。</p>
				
				<pre><code>[:a, :b, :c].first #=&gt; :a
</code></pre>
				
				<p>カーソル位置がオブジェクトの直後のメソッド呼び出しの<code>.</code>にあるとき、メソッド名が自動補完されるのを期待するのはごく自然なことと思います。</p>
				
				<h2>解決</h2>
				
				<p>つい先日リリースされたばかりの、<a href="http://github.com/ujihisa/neco-rubymf">neco-rubymf</a>というneocomplcacheプラギンを用います。</p>
				
				<p>インストール:</p>
				
				<ul>
				  <li>
				    <p>Rubygemsパッケージ<code>methodfinder</code>をインストールします。</p>
				
				    <pre><code>  $ gem install methodfinder
</code></pre>
				  </li>
				  <li>
				    <p>neocomplcacheプラギン<a href="http://github.com/ujihisa/neco-rubymf">neco-rubymf</a>をインストールします。もしも未だにneocomplcacheをインストールしていなければ、そちらもインストールして下さい。</p>
				  </li>
				</ul>
				
				<p>続いて、<code>'filetype'</code>が<code>ruby</code>であるバッファで、以下のように入力します(ただし<code>¶</code>はカーソルのつもりです。)</p>
				
				<pre><code>1.¶ #=&gt; 2
</code></pre>
				
				<p>すると、1というオブジェクトが持つメソッドでかつ返り値が2であるメソッド <code>next</code>と<code>succ</code>が補完候補にあらわれます。</p>
				
				<p><img src="http://cache.gyazo.com/431718249321702b98671e05463f495b.png" alt="neco-rubymf" /></p>
				
				<p>同様に、</p>
				
				<pre><code>[:a, :b, :c].¶ #=&gt; :a
</code></pre>
				
				<p>に対して</p>
				
				<p><img src="http://cache.gyazo.com/12aab5d2e5bec7c92bf26b4eee48adee.png" alt="array" /></p>
				
				<p>が得られます。</p>
				
				<p>以下に他の例を画像で示します。</p>
				
				<p><img src="http://cache.gyazo.com/73e6027c92217372f88410be049f6986.png" alt="1" /></p>
				
				<p><img src="http://cache.gyazo.com/e0d26e6e18d6138dd41f0e8656bfbb3f.png" alt="2" /></p>
				
				<p><img src="http://cache.gyazo.com/15ba0b10ba77ee74cf8fccd40332a816.png" alt="3" /></p>
				
				<p>※最後の例は確率的に発生します。</p>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/09/hack231/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #229: 動的型付け言語Rubyでメソッド名などを自動補完する</title>
		<link>http://vim-users.jp/2011/09/hack229/</link>
		<comments>http://vim-users.jp/2011/09/hack229/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 15:00:27 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2619</guid>
		<description><![CDATA[問題 静的型付け言語Haskellでの自動補完はHack #211で紹介しました。このときは補完候補の取得にghc-modという外部コマンドを用いました。補完候補を自動的に出力するためにneocomplcacheというV [...]]]></description>
			<content:encoded><![CDATA[				<h2>問題</h2>
				
				<p><img src="http://cache.gyazo.com/071b7fd4b985ad3d71e4ebb36c2ddea5.png" alt="" /></p>
				
				<p>静的型付け言語Haskellでの自動補完は<a href="http://vim-users.jp/2011/04/hack211/">Hack #211</a>で紹介しました。このときは補完候補の取得に<code>ghc-mod</code>という外部コマンドを用いました。補完候補を自動的に出力するために<code>neocomplcache</code>というVimプラギンを用いました。</p>
				
				<p>動的型付け言語Rubyにおける自動補完はどのようにすれば達成できるでしょうか。Rubyのように非常に静的な解析が難しい言語では、メソッド名などの候補の取得が非常に困難であることが知られています。そもそも現在参照している式あるいは変数がどのクラスに属しているか、ほとんどのケースでは静的に決定することができません。クラスが分かったとしても、その変数のみが特異メソッドを持っているかもしれません。</p>
				
				<h2>解決(1/2)</h2>
				
				<p>Rubyでメソッド名を手動補完するために使えるものは、標準添付の<code>vim-ruby</code>というVimプラギンと、m2ymさんによって開発された<a href="http://cx4a.org/software/rsense/">RSense</a>があります。</p>
				
				<p><code>vim-ruby</code>は、<code>+ruby</code>であるVim環境(*1)における補完機能を提供します。
				Ruby組み込み定数・クラス・グローバル関数(*2)などが補完できます。
				詳しくは<code>:h ft-ruby-omni</code>を参照してください(*3)。
				補完関数はオムニ補完として定義されているので、デフォルトの設定では、挿入モードで<code>&lt;C-x&gt;&lt;C-o&gt;</code>と打鍵することで補完機能を実行することができます。</p>
				
				<p><code>vim-ruby</code>が諦めた部分は</p>
				
				<ul>
				  <li>編集中ファイル内で定義された定数・クラス・メソッドなどへの補完</li>
				  <li>文脈に応じたメソッド名の補完 (例えば1という数値オブジェクトに対しては<code>Fixnum</code>クラスに定義されたメソッドのみが補完されるべき)</li>
				</ul>
				
				<p>です。これらに対応するためには、Rubyのパーサなどを実装する必要があり、かなり大変です。またそもそも処理に時間がかかりすぎ、補完機構としはやりすぎと判断したのかもしれません(*4)。</p>
				
				<p><img src="http://cache.gyazo.com/466b12454d1a8213b9826455f7e1b0d7.png" alt="図1: vim-rubyが正しく補完候補を生成している例" /></p>
				
				<p><img src="http://cache.gyazo.com/f933e019f0ae6dc10226f88a2f7b7274.png" alt="図2: vim-rubyが正しくない補完候補を生成してしまっている例" /></p>
				
				<p>一方RSenseは、<code>vim-ruby</code>が提供している機能にさらに加えて、上記の諦めた部分にも対応しています。</p>
				
				<p><img src="http://cache.gyazo.com/4643f4c15db03bc34aa91269c7fd0630.png" alt="図3: RSenseが正しく補完候補を生成している例" /></p>
				
				<p>RSenseの補完関数もオムニ補完として定義されています。デフォルトでは、挿入モード時に<code>&lt;C-x&gt;&lt;C-o&gt;</code>と打鍵することで補完のポップアップがでてきます。なお、初回起動時は若干時間がかかりますが、二回目からは非常にすばやいです(*5)。</p>
				
				<h2>解決(2/2)</h2>
				
				<p>手動補完がいかに実用的でないかは過去のVim Hacksで散々と述べられてきました。</p>
				
				<blockquote>
				  <p>通常の補完ではユーザーが明示的に補完のためのキーを押す必要がありました。つま
				り、「頭が補完をする」と考えなければ補完ができないのです。これにより、作業効
				率が落ちてしまいます。それならばシステムが自動的に判断して、補完のためのキー
				を押したらどうでしょうか。これでユーザーはやらなければならない作業のみに集中
				することができます。Vim7よりオムニ補完が実装されたので、Visual Studioのように
				「関数やメンバを補完」は実現できるようになりました。しかし、そこには「自動的
				に」が欠けているのです。</p>
				
				  <p>Shougo 2009 <a href="http://vim-users.jp/2009/07/hack-44/">http://vim-users.jp/2009/07/hack-44/</a></p>
				</blockquote>
				
				<p>自動補完を用いましょう。RSenseは<a href="https://github.com/Shougo/neocomplcache">neocomplcache</a>と連携することで自動補完として使うことができます。</p>
				
				<p>RSenseを公式ドキュメントに従ってインストールした上で、<code>~/.vimrc</code>に以下の記述を行ないましょう。</p>
				
				<pre><code>if !exists('g:neocomplcache_omni_patterns')
  let g:neocomplcache_omni_patterns = {}
endif
let g:rsenseUseOmniFunc = 1
if filereadable(expand('~/git/rsense/bin/rsense'))
  let g:rsenseHome = expand('~/git/rsense')

  let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
endif
</code></pre>
				
				<p>ただし、<code>'~/git/rsense/bin/rsense'</code>と<code>'~/git/rsense'</code>の部分を自身の環境に合致する内容にしてください。</p>
				
				<p>なお、この設定は、neocomplcache作者により書かれた以下の記事を参考にしています。</p>
				
				<p><a href="http://vinarian.blogspot.com/2010/03/rsenseneocomplcache.html">http://vinarian.blogspot.com/2010/03/rsenseneocomplcache.html</a></p>
				
				<h2>補足</h2>
				
				<p>RSenseですら、特異メソッドには対応していないようです。</p>
				
				<pre><code>a = Object.new
def a.hello
  :world
end
a.
</code></pre>
				
				<p>ここから<code>hello</code>を補完することはできません。(*6)</p>
				
				<p>脚注</p>
				
				<ul>
				  <li>*1 <code>:version</code>して<code>+ruby</code>があるかどうか調べてみてください。まあ、不必要です。</li>
				  <li>*2 本記事の読者がRuby使いには限らないことを考慮して”グローバル関数”と記述しましたが、実際にはRubyに関数は存在しません。<code>Kernel</code>などに定義されている<code>p</code>などのメソッドを便宜的にそのように読んでみました。</li>
				  <li>*3 なお、ドキュメントに書かれているからといって実際に動作するとは限りません。私の環境では実際に試してみると動作しないものがたくさんありました…。</li>
				  <li>*4 <code>g:rubycomplete_buffer_loading</code>や<code>g:rubycomplete_classes_in_global</code>を設定し、かつ<code>+ruby</code>な環境であればそれらにも対応しているとドキュメントに書かれています。お試しください。常用するのはかなり難しいようです。</li>
				  <li>*5 初回起動時にこっそりと補完サーバを立ち上げるためです。なお、Windows環境の場合は特別な設定が必要なようです。詳しくは公式ドキュメントを参照ください。</li>
				  <li>*6 この例だとhelloメソッドが同じバッファで定義されているのでneocomplcacheのバッファ内キーワード補完が働き、<code>hello</code>が補完対象にあらわれます。が、これはオブジェクト<code>a</code>だけでなくすべての対象に働いてしまいます。また、<code>hello</code>の定義がそのバッファ内でないなら、当然ながらお手上げです。</li>
				</ul>
				
				<h2>参考文献</h2>
				
				<p><a href="http://ujihisa.blogspot.com/2011/06/vanrb-lightning-talk-slides-ruby-and.html">Vanrb Lightning Talk Slides: Ruby and Vim</a></p>
				
				<p>非常にわかりやすい図がたくさんあります。</p>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/09/hack229/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #228: 見た目を気軽に変更する(その２) ColorRoller版</title>
		<link>http://vim-users.jp/2011/09/hack228/</link>
		<comments>http://vim-users.jp/2011/09/hack228/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 15:00:30 +0000</pubDate>
		<dc:creator>t9md</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2575</guid>
		<description><![CDATA[問題 vim を長い間使用していると、お気に入りの定番カラースキームが３、４種類は決まってくるものです。 お気に入りのカラースキームを探す場合は、 Color Sampler Pack をインストールする。 :Unite [...]]]></description>
			<content:encoded><![CDATA[				<h2>問題</h2>
				
				<p>vim を長い間使用していると、お気に入りの定番カラースキームが３、４種類は決まってくるものです。</p>
				
				<p>お気に入りのカラースキームを探す場合は、</p>
				
				<ol>
				<li><a href="http://www.vim.org/scripts/script.php?script_id=625">Color Sampler Pack</a> をインストールする。</li>
				<li><kbd><code>:Unite colorscheme</code></kbd> を駆使して片っ端から気に入るものを探す。</li>
				</ol>
				
				<p>という流れで探すのが便利で手軽だと思います。</p>
				
				<p><kbd><code>:Unite colorscheme</code></kbd> によるカラースキームの変更は一つ一つ <kbd><code>:colorscheme</code></kbd> コマンドでカラースキームを入力する手間に比べればとても手軽です。<br />
				しかし、一度お気に入りが決まってしまうと、 もっと手早くカラースキームを切り替えたいと感じる方もいるのではないでしょうか？</p>
				
				<p>問題提起が少し強引な気もしますが、筆者はお気に入りの３、４種類のカラースキームをワンキーで手早く切り替えたいと感じていました。</p>
				
				<h2>対処</h2>
				
				<p>下記のコードを <kbd><code>.vimrc</code></kbd> に貼り付けます。</p>
				
				<pre><code>let ColorRoller = {}
let ColorRoller.colors = [
      \ 'molokai_custom',
      \ 'tomorrow_night_custom',
      \ 'lucius_custom',
      \ 'github256_custom',
      \ 'pyte',
      \ 'newspaper',
      \ ]

function! ColorRoller.change()
  let color = get(self.colors, 0)
  " tabpagecolorscheme を使用している場合は↓の "colorscheme" を "Tcolorscheme" に変える。
  silent exe "colorscheme " . color
  redraw
  echo self.colors
endfunction

function! ColorRoller.roll()
  let item = remove(self.colors, 0)
  call insert(self.colors, item, len(self.colors))
  call self.change()
endfunction

function! ColorRoller.unroll()
  let item = remove(self.colors, -1)
  call insert(self.colors, item, 0)
  call self.change()
endfunction

nnoremap &lt;silent&gt;&lt;F9&gt;   :&lt;C-u&gt;call ColorRoller.roll()&lt;CR&gt;
nnoremap &lt;silent&gt;&lt;S-F9&gt; :&lt;C-u&gt;call ColorRoller.unroll()&lt;CR&gt;
</code></pre>
				
				<h2>解説</h2>
				
				<p>お気に入りのカラースキーム群をローラー( <code>ColorRoller</code> )に見立てて、ローラーを回す( <code>roll</code> )、戻す( <code>unroll</code> )ことで、カラースキームを切り替えます。<br />
				<kbd><code>roll()</code></kbd> を <kbd><code>&lt;F9&gt;</code></kbd> 、 <kbd><code>unroll()</code></kbd> を <kbd><code>&lt;S-F9&gt;</code></kbd> (Shiftキーを押しながら <kbd><code>&lt;F9&gt;</code></kbd> )にそれぞれ割り当てています。</p>
				
				<h2>使い方</h2>
				
				<p>お気に入りのカラースキームを、 <kbd><code>ColorRoller.colors</code></kbd> に設定して使用します。</p>
				
				<p><a href="http://www.vim.org/scripts/script.php?script_id=3358">tabpagecolorscheme</a> を使用している場合、 <kbd><code>ColorRoller.change()</code></kbd> 内のコメントを参考に、<br />
				<kbd><code>silent exe "colorscheme " . color</code></kbd> の行を <kbd><code>silent exe "Tcolorscheme " . color</code></kbd> に変更して使用して下さい。</p>
				
				<h2>最後に</h2>
				
				<p>これまでに紹介したカラースキームに関する下記の記事も合わせて参考にして下さい。</p>
				
				<ul>
				<li><a href="http://vim-users.jp/2011/01/hack196/">Hack #196: カラースキームは開発支援ツール</a></li>
				<li><a href="http://vim-users.jp/2010/12/hack188/">Hack #188: 見た目を気軽に変更する</a></li>
				</ul>
				
				<address class="hack-author">t9md</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/09/hack228/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #227: surround.vim の囲むルールを独自に拡張する</title>
		<link>http://vim-users.jp/2011/09/hack227/</link>
		<comments>http://vim-users.jp/2011/09/hack227/#comments</comments>
		<pubDate>Sun, 04 Sep 2011 15:00:48 +0000</pubDate>
		<dc:creator>t9md</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2589</guid>
		<description><![CDATA[surround.vim について テキストを好きな文字列で&#8221;囲む&#8221;ことに特化したプラグインとして、surround.vim があります。 定番プラグインなので使用している方も多いでしょう。 デフ [...]]]></description>
			<content:encoded><![CDATA[				<h2>surround.vim について</h2>
				
				<p>テキストを好きな文字列で&#8221;囲む&#8221;ことに特化したプラグインとして、<a href="http://www.vim.org/scripts/script.php?script_id=1697">surround.vim</a> があります。<br />
				定番プラグインなので使用している方も多いでしょう。</p>
				
				<p>デフォルトで、テキストを括弧( <kbd><code>[([{</code></kbd> 等)や、HTMLタグで囲んだりする事が出来ます。</p>
				
				<p>surround.vim は囲むルール( 以降 surrounding rule と記載 )を拡張する機能を用意しており、ユーザーが独自に surrounding rule を追加することが出来ます。</p>
				
				<h2>surrounding rule の拡張</h2>
				
				<p>例えば下記のような設定は</p>
				
				<pre><code>autocmd FileType ruby let b:surround_45 = "&lt;% \r %&gt;"
</code></pre>
				
				<p><code>&amp;filetype</code> が ruby 場合に <code>let b:surround_45 = "&lt;% \r %&gt;"</code> を設定しています。</p>
				
				<ul>
				<li><kbd><code>b:surround_45</code></kbd> の  <kbd><code>45</code></kbd> は  <kbd><code>-</code></kbd> の ASCII コード番号です。</li>
				<li><kbd><code>\r</code></kbd> は囲まれるテキストが入るプレースホルダです。</li>
				</ul>
				
				<p>上記のように設定すると、</p>
				
				<pre><code>puts "Hello world!"
</code></pre>
				
				<p>の行にカーソルを合わせ、ノーマルモードで  <kbd><code>yss-</code></kbd> と入力すると、下記のように eruby のコードとして囲む事ができます。</p>
				
				<pre><code>&lt;% puts "Hello world!" %&gt;
</code></pre>
				
				<p>しかし、毎回 ASCII コードを確認して設定するのは面倒なので、 <kbd><code>char2nr()</code></kbd> を使用し、下記のように設定する方が分かりやすいでしょう。<br />
				以下の設定は <kbd><code>E</code></kbd> で囲まれるテキストをヒアドキュメント化します。</p>
				
				<pre><code>let b:surround_{char2nr("E")} = "&lt;&lt;EOS \r EOS"
</code></pre>
				
				<p>surrounding rule のより詳細な説明は <kbd><code>:help surround-customizing</code></kbd> を参考にして下さい。</p>
				
				<h2>さらに簡単に surrounding rule を拡張する</h2>
				
				<p>さて、ここまでは前置きで、目的は基本知識の整理だったのでした。<br />
				上述の surrounding rule の拡張をより簡単に行う為の、簡単なプラグインを作成しました。</p>
				
				<ul>
				<li><a href="https://github.com/t9md/vim-surround_custom_mapping">vim-surround_custom_mapping</a></li>
				</ul>
				
				<h2>インストール</h2>
				
				<p>Vundle を使用している場合以下のコマンドでインストール出来ます。</p>
				
				<pre><code>:BundleInstall t9md/vim-surround_custom_mapping
</code></pre>
				
				<h2>設定</h2>
				
				<p><kbd><code>g:surround_custom_mapping</code></kbd> ディクショナリを設定します。<br />
				キー に surrounding rule が設定される <kbd><code>&amp;filetype</code></kbd> 、値には surrounding rule をディクショナリとして設定します。<br />
				キー <kbd><code>_</code></kbd>(アンダースコア)は特殊なキーで、ここに設定された surrounding rule は全てのファイルタイプで利用できるようになります。</p>
				
				<p>例えば下記の様に設定すると</p>
				
				<pre><code>let g:surround_custom_mapping = {}
let g:surround_custom_mapping._ = {
            \ 'p':  "&lt;pre&gt; \r &lt;/pre&gt;",
            \ 'w':  "%w(\r)",
            \ }
let g:surround_custom_mapping.ruby = {
            \ '-':  "&lt;% \r %&gt;",
            \ '=':  "&lt;%= \r %&gt;",
            \ }
</code></pre>
				
				<ul>
				<li><kbd><code>p</code></kbd> で <code>pre</code> タグで囲む(全てのファイルタイプで有効)</li>
				<li><kbd><code>w</code></kbd> で <code>%w(</code> と <code>)</code> で囲む(全てのファイルタイプで有効)</li>
				<li><kbd><code>-</code></kbd> で <code>%&lt;</code> と <code>%&gt;</code> で囲む(ruby ファイルのみ)</li>
				<li><kbd><code>=</code></kbd> で <code>%&lt;=</code> と <code>%&gt;</code> で囲む(ruby ファイルのみ)</li>
				</ul>
				
				<p>という意味になります。</p>
				
				<h2>より具体的な例</h2>
				
				<p>もともと私がこのヘルパープラグインを作ったのは</p>
				
				<ul>
				<li>html を編集していようが、</li>
				<li>textile を編集していようが、</li>
				<li>vim のヘルプを編集していようが</li>
				</ul>
				
				<p><kbd><code>p</code></kbd> で整形済みテキストとして囲むというように、<strong>似た様な意味(=整形済みテキスト)で囲む場合は、指運動を同じにしたかった</strong> からです。<br />
				意味に対応する指運動(=運指)が別だと覚えるのが大変です。<br />
				上記を実現する設定は下記になります。</p>
				
				<pre><code>let g:surround_custom_mapping = {}
let g:surround_custom_mapping.help = {
            \ 'p':  "&gt; \r &lt;",
            \ }
let g:surround_custom_mapping.textile = {
            \ 'p':  "&lt;pre&gt; \r &lt;/pre&gt;",
            \ }
let g:surround_custom_mapping.html = {
            \ 'p':  "&lt;pre&gt; \r &lt;/pre&gt;",
            \ }
</code></pre>
				
				<h2>最後に</h2>
				
				<p>このプラグインを作った際、surround.vim 作者の tpope さんに <a href="https://github.com/tpope/vim-surround/pull/32">Pull Request</a> を送りました。<br />
				取り込まれはしませんでしたが、８/７ 日頃に「 来月か、再来月位に新しいのを出す予定、それまでこの pull request はオープンにしておくよ。」と返事をくれました。<br />
				ですので、もしかすると９月か１０月頃には surround.vim のニューバージョンがリリースされ、今回紹介したプラグインは不要になっているかもしれません。</p>
				
				<address class="hack-author">t9md</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/09/hack227/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

