<?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; Vim Hacks</title>
	<atom:link href="http://vim-users.jp/category/vim-hacks/feed/" rel="self" type="application/rss+xml" />
	<link>http://vim-users.jp</link>
	<description>日本の Vim ユーザのためのハブサイト</description>
	<lastBuildDate>Tue, 09 Mar 2010 11:41:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hack #130: :grepをより便利に利用する</title>
		<link>http://vim-users.jp/2010/03/hack130/</link>
		<comments>http://vim-users.jp/2010/03/hack130/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 15:00:26 +0000</pubDate>
		<dc:creator>kana</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1423</guid>
		<description><![CDATA[				問題
				
				Hack #129: 複数のファイルから検索する
				では:grepについて紹介しました。
				色々と便利なコマンドなのですが、頻繁に使っていると次のような不満が出てきます:
		 [...]]]></description>
			<content:encoded><![CDATA[				<h3>問題</h3>
				
				<p><a href="http://vim-users.jp/2010/03/hack129/">Hack #129: 複数のファイルから検索する</a>
				では<code>:grep</code>について紹介しました。
				色々と便利なコマンドなのですが、頻繁に使っていると次のような不満が出てきます:</p>
				
				<p><code>:grep</code>の引数は基本的に</p>
				
				<pre><code>:grep {pattern} {file} ...
</code></pre>
				
				<p>なのですが、同じファイル郡に対して異なるパターンで<code>:grep</code>する
				というケースは少なくありません。例えば</p>
				
				<pre><code>:grep rebase *.[ch]
</code></pre>
				
				<p>で検索した後で</p>
				
				<pre><code>:grep rebase_cmd *.[ch]
</code></pre>
				
				<p>と検索しなおすとしましょう。全てのコマンドを入力しなおすと面倒ですから、
				通常は入力履歴を<kbd>&lt;Up&gt;</kbd>/<kbd>&lt;Down&gt;</kbd>で参照して以前入力した
				コマンドを修正する形になります。</p>
				
				<p>ここで、入力履歴を手繰るまではよいのですが、
				パターンを修正するところが問題です。
				修正するためには<kbd>&lt;Left&gt;&lt;Left&gt;&lt;Left&gt;...</kbd>などとしてパターンの箇所まで
				カーソルを移動しなければならないのですが、これが面倒です。
				特に<code>{file} ...</code>の指定が長くなると面倒さが倍増します。
				どうにかして簡単に修正することはできないでしょうか。</p>
				
				<h3>解決方法</h3>
				
				<p>以下の内容をvimrcに追加します:</p>
				
				<pre><code>command! -complete=file -nargs=+ Grep  call s:grep([&lt;f-args&gt;])
function! s:grep(args)
  execute 'vimgrep' '/'.a:args[-1].'/' join(a:args[:-2])
endfunction
</code></pre>
				
				<p>これにより<code>:grep</code>の代わりに
				以下のような<code>:Grep</code>コマンドが使えるようになります:</p>
				
				<pre><code>:Grep {file} ... {pattern}
</code></pre>
				
				<p><code>:grep</code>での煩雑さは最初の引数が<var>{pattern}</var>であることが
				原因なので、その逆で最後の引数が<var>{pattern}</var>であるコマンドがあれば
				パターンの修正は<kbd>&lt;Up&gt;&lt;C-w&gt;&lt;C-w&gt;...</kbd>だけで済みます。</p>
				
				<h3>参考資料</h3>
				
				<ul>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/quickfix.html#:grep">:help :grep</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/map.html#:command">:help :command</a></li>
				</ul>
				
				<address class="hack-author">kana</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/03/hack130/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #129: 複数のファイルから検索する</title>
		<link>http://vim-users.jp/2010/03/hack129/</link>
		<comments>http://vim-users.jp/2010/03/hack129/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 15:00:02 +0000</pubDate>
		<dc:creator>thinca</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv1]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1400</guid>
		<description><![CDATA[				時折、大量にあるテキストファイルから特定のテキストを検索したい場合があります。grep などのプログラムが有名ですが、やはり検索結果から直接該当のファイルにジャンプできると便利です。
				
				:grep [...]]]></description>
			<content:encoded><![CDATA[				<p>時折、大量にあるテキストファイルから特定のテキストを検索したい場合があります。grep などのプログラムが有名ですが、やはり検索結果から直接該当のファイルにジャンプできると便利です。</p>
				
				<h3>:grep コマンド</h3>
				
				<p>:grep コマンドは、<code class="option">'grepprg'</code> オプションで指定された外部プログラムを実行してテキストの検索を行い、結果を <code class="option">'errorformat'</code> オプションに従って解釈したあと、quickfix ウィンドウへ出力します。quickfix 上で結果を選択して <kbd>&lt;Enter&gt;</kbd> を押すことで目的のファイルの目的の行にジャンプすることができます。
				各オプションにはデフォルトで適切な値が設定されており、通常はいじる必要はありません。</p>
				
				<p>:grepadd と言うコマンドもあり、これは quickfix ウィンドウの中身を置き代えずに追記します。複数の grep の結果を見るのに便利です。</p>
				
				<h3>:vimgrep コマンド</h3>
				
				<p>:grep コマンドは外部のプログラムに依存するため、その実装によって挙動が異なることがあります。例えば、Windows では標準では findstr が使用されます。これは grep とはまったく異なるものなので、指定する引数も使える正規表現も違います。</p>
				
				<p>そういう経緯もあってかどうかは知りませんが、Vim には :vimgrep と言う自力で grep を行う組み込みコマンドがあります。基本的な使い方は :grep と同じです。</p>
				
				<pre><code>:vimgrep /pattern/ {file}...
:vimgrepadd /pattern/ {file}...
</code></pre>
				
				<p>pattern には Vim の正規表現が使えます。単純な単語の場合、前後の / は省略可能です。</p>
				
				<p>{file} の部分に検索対象のファイルを指定します。指定にはワイルドカードが使えます(:help wildcard)。これは <code>**</code> による再帰的な探索に対応しています。</p>
				
				<pre><code>:vimprep /\&lt;variable\&gt;/ **/*.c
</code></pre>
				
				<p>パターンの後ろにフラグを付けることで挙動を変更できます。</p>
				
				<table>
				  <tr><th>フラグ</th><th>意味</th></tr>
				  <tr><th>g</th><td>1 つの行に複数のマッチが見つかった場合、同じ行を複数回列挙します。</td></tr>
				  <tr><th>j</th><td>通常、検索対象が見つかった場合は最初の候補にジャンプしますが、このジャンプを抑制します。</td></tr>
				</table>
				
				<pre><code>:vimprep /\&lt;variable\&gt;/j **/*.c
</code></pre>
				
				<p>コマンドの前に数字を置くことで、検索件数の上限を指定できます。これにより検索時間を短縮できます。例えば、最初に見つかった 1 件だけを表示するには以下のようにします。</p>
				
				<pre><code>:1vimprep /\&lt;variable\&gt;/ **/*.c
</code></pre>
				
				<p><code class="option">'grepprg'</code> に &quot;internal&quot; と設定すると、:grep で :vimgrep が使われるようになります。</p>
				
				<pre><code>set grepprg=internal
</code></pre>
				
				<p>:vimgrep は挙動が統一されているので、様々な環境で同じように grep を行いたい場合に非常に便利です。</p>
				
				<address class="hack-author">thinca</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/03/hack129/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #128: neocomplcache Hacks(3)　キーワード補完</title>
		<link>http://vim-users.jp/2010/03/hack128/</link>
		<comments>http://vim-users.jp/2010/03/hack128/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 15:00:04 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[neocomplcache]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1240</guid>
		<description><![CDATA[				三回目の今回はneocomplcacheのキーワード補完と拡張プラグインを解説します。
				
				キーワード補完とは
				
				neocomplcacheのキーワード補完は、&#60;C-n&#62; [...]]]></description>
			<content:encoded><![CDATA[				<p>三回目の今回はneocomplcacheのキーワード補完と拡張プラグインを解説します。</p>
				
				<h2>キーワード補完とは</h2>
				
				<p>neocomplcacheのキーワード補完は、<code>&lt;C-n&gt;</code>や<code>&lt;C-p&gt;</code>で呼び出すことのできるVim組み込みのキーワード補完を模倣して設計されています。
				言語ごとにキーワードパターンを定義して、一括して候補を検索できるのが最大の特徴です。
				使用するキーワードパターンは<code>g:NeoComplCache_KeywordPatterns</code>で定義されています。</p>
				
				<h2>pluginとcomplfuncの違い</h2>
				
				<p>neocomplcacheには補完候補を収集するために、pluginとcomplfuncという二つの拡張プラグインが存在します。
				それぞれ、<code>autoload/neocomplcache/plugin</code>と<code>autoload/neocomplcache/complfunc</code>に配置します。
				pluginは<code>keyword_complete.vim</code>から一括して呼びだされる拡張プラグインで、単純なため実装が比較的簡単です。
				complfuncは補完開始位置を拡張プラグイン側で計算しないといけません。
				その代わり、補完開始位置は自由に決定できるので、ファイル名補完のような複雑な補完を実装できます。
				初期のneocomplcacheでは、complfuncは一つのプラグインしか呼べないという制限がありました。
				現在のバージョンでは、complfuncの候補も統合できるように改良されているため、そのような制限はありません。</p>
				
				<h2>標準添付のplugin</h2>
				
				<h3>buffer_complete.vim</h3>
				
				<p>開いているバッファから補完候補を収集するプラグインです。バッファ内の単語を解析することで、使用頻度の学習も行います。</p>
				
				<h3>dictionary_complete.vim</h3>
				
				<p><code>g:NeoComplCache_DictionaryFileTypeLists</code>から補完候補を収集するプラグインです。</p>
				
				<h3>include_complete.vim</h3>
				
				<p>バッファで開いているインクルードファイルから補完候補を収集するプラグインです。Vimにもインクルード補完はありますが、より拡張されています。</p>
				
				<h3>snippets_complete.vim</h3>
				
				<p>スニペットを補完するプラグインです。補完するだけではなく、単体でスニペット展開プラグインとしても動作します。</p>
				
				<h3>syntax_complete.vim</h3>
				
				<p>シンタックスファイルからキーワードを補完するプラグインです。Vim標準添付のsyntaxcomplete.vimよりも高機能であり、結果をキャッシュするので高速です。複雑なTeXのシンタックスも解析できます。</p>
				
				<h3>tags_complete.vim</h3>
				
				<p>タグファイルからキーワードを補完するプラグインです。</p>
				
				<h2>標準添付のcomplfunc</h2>
				
				<h3>completefunc_complete.vim</h3>
				
				<p>補完関数を登録することで、自動呼び出しするプラグインです。neocomplcacheは<code>completefunc</code>を上書きしてしまうので、その対策に使えます。
				手動補完として補完関数を個別に呼び出しすることもできます。</p>
				
				<h3>filename_complete.vim</h3>
				
				<p>ファイル名を補完するプラグインです。詳しい解説は、<em>[Hack #119: neocomplcache Hacks(2) オムニ補完]</em>を参照してください。</p>
				
				<h3>keyword_complete.vim</h3>
				
				<p>pluginから候補を収集し、キーワードを補完するプラグインです。</p>
				
				<h3>omni_complete.vim</h3>
				
				<p>オムニ補完を呼び出し、候補を収集するプラグインです。詳しい解説は、<em>[Hack #119: neocomplcache Hacks(2) オムニ補完]</em>を参照してください。</p>
				
				<h3>vim_complete.vim</h3>
				
				<p>Vimのオムニ補完機能を提供するプラグインです。Vim標準の<code>&lt;C-x&gt;&lt;C-v&gt;</code>よりも機能が拡張されていて、ローカル変数や引数の補完も可能です。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/03/hack128/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #127: !を含む外部コマンドを実行する</title>
		<link>http://vim-users.jp/2010/02/hack127/</link>
		<comments>http://vim-users.jp/2010/02/hack127/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 15:00:31 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1353</guid>
		<description><![CDATA[				問題
				
				UNIXのechoコマンドで&#34;hello!&#34;と表示させる必要があるとします。Vimの:!を使えば出来そうな気がします。試してみましょう。
				
				:!echo [...]]]></description>
			<content:encoded><![CDATA[				<h2>問題</h2>
				
				<p>UNIXの<code>echo</code>コマンドで&quot;hello!&quot;と表示させる必要があるとします。Vimの<code>:!</code>を使えば出来そうな気がします。試してみましょう。</p>
				
				<pre><code>:!echo helloecho 'echo echo 1'
[No write since last change]
helloecho echo echo 1
</code></pre>
				
				<p>なにやら狂ったような返答がきました。これは一体…。</p>
				
				<p>※ 実行結果は人によって異なります。</p>
				
				<h2>解決</h2>
				
				<p>次のようにして<code>!</code>をエスケープします。</p>
				
				<pre><code>:!echo hello\!
[No write since last change]
hello!
</code></pre>
				
				<p>次のようにしても、エスケープされませんのでご注意ください。</p>
				
				<p>:!&#8217;echo hello!&#8217;</p>
				
				<h2>解説</h2>
				
				<p>ヘルプ<code>:h :!</code>によると、<code>:!</code>の中での<code>!</code>は前回実行した<code>:!</code>の引数になるそうです。
				迷惑でしかない恐ろしい仕様です。(<code><code class="option">'cpoptions'</code></code>に依存するようです)</p>
				
				<p>プラギンを作るときにハマる仕様です。<code>:!</code>を使うときによくわからない挙動があれば、まずは<code>!</code>のエスケープ漏れがないか確認してみましょう。</p>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack127/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #126: クリップボードを利用する</title>
		<link>http://vim-users.jp/2010/02/hack126/</link>
		<comments>http://vim-users.jp/2010/02/hack126/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 15:00:00 +0000</pubDate>
		<dc:creator>kana</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[Vim script]]></category>
		<category><![CDATA[lv1]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1285</guid>
		<description><![CDATA[				問題1
				
				ふつうのテキストエディタであれば
				クリップボードにあるテキストがペーストされ、
				コピーしたテキストはクリップボードに保存されます。
				
				しかしVimではコピ [...]]]></description>
			<content:encoded><![CDATA[				<h3>問題1</h3>
				
				<p>ふつうのテキストエディタであれば
				クリップボードにあるテキストがペーストされ、
				コピーしたテキストはクリップボードに保存されます。</p>
				
				<p>しかしVimではコピー/ペーストされるテキストは
				レジスタと呼ばれるVim内部の領域から読み書きされるため、
				そのようにはなっていません。</p>
				
				<p>クリップボードに対してコピー/ペーストを行なうにはどうすればよいのでしょうか。</p>
				
				<h3>解決方法1</h3>
				
				<p>Vimには
				クリップボードを表す仮想的なレジスタ<code><em>"*</em></code>があるため、
				コピー/ペーストする際にそのレジスタを使用するよう指定します。
				例えばクリップボードへ1行分のテキストをコピーする場合は
				以下のコマンドを入力します:</p>
				
				<pre><code>"*Y
</code></pre>
				
				<p>クリップボードからテキストをペーストする場合は
				以下のコマンドを入力します:</p>
				
				<pre><code>"*p
</code></pre>
				
				<h3>問題2</h3>
				
				<p>Vimからクリップボードにアクセスする方法は分かりました。
				しかし毎回<code>"*</code>を指定しなければならず、入力が面倒です。
				Vim内でテキストのコピー/ペーストを行なう場合に、
				何も指定しなくても自動的にクリップボードを利用するようにできないでしょうか。</p>
				
				<h3>解決方法2</h3>
				
				<p>以下のコマンドを実行します:</p>
				
				<pre><code>:set clipboard=unnamed
</code></pre>
				
				<p>この設定を行なうと、
				特にレジスタを指定せずにコピー/ペーストを行なった場合は
				クリップボードを利用するようになります。</p>
				
				<p>また、xtermなどのX Window System下のアプリケーションでは
				選択されたテキストが自動的にクリップボードへコピーされます。
				VimのVisual modeでも同様の挙動にしたい場合は以下のコマンドを実行します。</p>
				
				<pre><code>:set clipboard=autoselect
</code></pre>
				
				<p>もし両方の挙動が必要な場合は以下のように値をコンマ(,)区切りで指定します:</p>
				
				<pre><code>:set clipboard=unnamed,autoselect
</code></pre>
				
				<h3>問題3</h3>
				
				<p>基本的にGUI版のVimでしかクリップボードに関する機能は利用できません。
				つまり、諸事情で端末エミュレータ内でVimを利用している場合は
				クリップボード関連の機能は使えません。</p>
				
				<p>幸いなことに、
				一部の環境ではクリップボードにアクセスするためのコマンドがあります。
				例えばMac OS Xの場合はpbcopy/pbpasteでクリップボードの読み書きができるため、
				<code>:read !pbpaste</code>などとすればクリップボードの内容を取り込むことが
				できます。</p>
				
				<p>しかしこのようなコマンドは入力が煩雑ですし、
				何より<code>d</code>/<code>p</code>/<code>y</code>のような
				Vim本来の操作と比べると不便です。
				どうにかして<code>"*</code>と同様の操作性を実現できないでしょうか。</p>
				
				<h3>解決方法3</h3>
				
				<p><a href="http://www.vim.org/scripts/script.php?script_id=2098">fakeclip</a>を使います。
				このプラグインをインストールすると
				Cygwin、Mac OS X、X Window Systemの非GUI版Vimでも
				<code>"*Y</code>や
				<code>"&#42;p</code>などの操作ができるようになります
				(バージョン0.2.6現在)。</p>
				
				<h3>解説</h3>
				
				<p>Q. なぜ<code>"*Y</code>のようなまどろっこしい操作になっているのですか?</p>
				
				<p>A. 祖先のviが生まれた頃にクリップボードなんてものはなかったからです。</p>
				
				<p>Q. なぜ<code>:set clipboard=unnamed</code>がデフォルトでないのですか?</p>
				
				<p>A. Vimのデフォルト設定は可能な限りviライクだからです。
				そして祖先のviが生まれた頃にクリップボードなんてものはなかったからです。</p>
				
				<h3>参考資料</h3>
				
				<ul>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/options.html#'clipboard'">:help &#8216;clipboard&#8217;</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/gui.html#quotestar">:help &#8220;*</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/change.html#registers">:help registers</a></li>
				<li><a href="http://www.vim.org/scripts/script.php?script_id=2098">fakeclip</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/insert.html#:read!">:help :read!</a></li>
				</ul>
				
				<address class="hack-author">kana</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack126/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #125: 矩形選択で自由に移動する</title>
		<link>http://vim-users.jp/2010/02/hack125/</link>
		<comments>http://vim-users.jp/2010/02/hack125/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 15:00:45 +0000</pubDate>
		<dc:creator>thinca</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv1]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1375</guid>
		<description><![CDATA[				Vim は &#60;C-v&#62; で矩形選択を行うことができます。非常に便利な機能ですが、矩形の端の行の行末にテキストがない場合、選択が困難、もしくは不可能になってしまう場合があります。これは設定で回避できます [...]]]></description>
			<content:encoded><![CDATA[				<p>Vim は <kbd>&lt;C-v&gt;</kbd> で矩形選択を行うことができます。非常に便利な機能ですが、矩形の端の行の行末にテキストがない場合、選択が困難、もしくは不可能になってしまう場合があります。これは設定で回避できます。</p>
				
				<h3>設定</h3>
				
				<p>以下の設定を行います。</p>
				
				<pre><code>set virtualedit+=block
</code></pre>
				
				<p>この設定を行うことで、矩形選択中は行末にテキストがなくてもカーソルを行末以降に移動させることができるようになります。</p>
				
				<h3>解説</h3>
				
				<p><code class="option">'virtualedit'</code> オプションは、仮想編集を有効にするモードを設定するオプションです。仮想編集中は実際に文字がないところへカーソルを移動させることができます。つまり、タブ文字の内部や行末より後ろへカーソルを移動させることができるようになります。ただしファイルの末尾以降の行へは移動できません。</p>
				
				<p>また、<code class="option">'virtualedit'</code> オプションはカンマ区切りの値を指定するオプションで、+= を使っていたのはそのためです。他にも insert(Insert mode で仮想編集を有効にする) や all(全てのモードで仮想編集を有効にする) が指定でき、他にはちょっと変わった値として onemore(行末の1文字先までカーソルを移動できるようにする) が指定できます。</p>
				
				<address class="hack-author">thinca</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack125/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #124: Vimで非同期実行を行う</title>
		<link>http://vim-users.jp/2010/02/hack124/</link>
		<comments>http://vim-users.jp/2010/02/hack124/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 15:00:16 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv3]]></category>
		<category><![CDATA[vimproc]]></category>
		<category><![CDATA[vimshell]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1237</guid>
		<description><![CDATA[				VimがEmacsと比較して一番劣っている機能として、コマンドの非同期実行があげられます。ここでは現状のコマンド実行の問題点とEmacsとの比較、その解決方法について議論を行います。
				
				Vimのコ [...]]]></description>
			<content:encoded><![CDATA[				<p>VimがEmacsと比較して一番劣っている機能として、コマンドの非同期実行があげられます。ここでは現状のコマンド実行の問題点とEmacsとの比較、その解決方法について議論を行います。</p>
				
				<h2>Vimのコマンド実行の欠点</h2>
				
				<p>Vimは<code>sytem()</code>や<code>:read</code>を用いて外部コマンドを実行し、その結果を得ることができます。これは非常に便利なのですが、Vimが起動した外部コマンドの終了を待ち合わせるため、Vimが停止してしまうという欠点があります。これは特にquickrunや<code>:make</code>を実行しているときに問題となります。プログラムをバックグラウンドで実行すれば、終了を待ち合わせずにすみますが、それでは結果がとれません。さらにWindows上のGVimの場合、外部コマンドを実行するたびにDOS窓が開いて煩わしいです。
				処理内容がシェルに依存するという欠点もあります。たとえば、Windowsでプログラムを起動するためには適切にエスケープしなければいけません。</p>
				
				<h2>Emacsとの比較</h2>
				
				<p>対するEmacsはどうでしょう。Emacsでは、<code>start-process</code>関数を用いてプロセスを生成することにより、コマンドを非同期的に実行できます。
				comint-modeでもこれを用いてインタプリタを起動し、非同期で通信しています。
				ただし、Emacsにはマルチスレッド関数がありません。全ての処理はシングルスレッドです。</p>
				
				<h2>外部インタフェースの欠点</h2>
				
				<p>RubyやPerl, Pythonといった外部インタフェースを用いるという解決策もあります。
				しかし、外部インタフェースは通常のVimScriptとは文法が異なるため、連携が非常にややこしいです。時折フリーズしたり、エラーが起こったときにデバッグしづらいという欠点もあります。さらに、すべての環境で使えるわけでもありません。インストールしているRubyやPerl, Pythonのバージョンにも依存するなど、
				非同期に通信するためだけに外部インタフェースを用いるのは大げさすぎます。
				ただし外部インタフェース内ではマルチスレッドが使えるので、真の非同期通信をするためには、外部インタフェースを用いるほかありません。</p>
				
				<h2>vimprocについて</h2>
				
				<p>外部ライブラリであるvimprocを用いて外部コマンドと通信すれば、上記に挙げたほとんどの欠点が解消されます。
				vimprocとはYukihiro Nakadairaさんが開発している、優れた非同期実行ライブラリです。私が改良したものをgithub上で開発しています。
				<a href="http://github.com/Shougo/vimproc/tree/master">http://github.com/Shougo/vimproc/tree/master</a>
				ソースからコンパイルしてVimのautoloadディレクトリに、「proc.soまたはproc.dll」と「vimproc.vim」をコピーすれば準備完了です。</p>
				
				<p>ここでは、vimprocで実装されている<code>vimproc#system</code>関数を紹介します。これは、標準の<code>system</code>関数を置き換えることができます。
				ただしシェルを起動しないので、シェルの内部コマンドは動作しません。パイプやリダイレクトも動かないので注意してください。
				パイプやリダイレクトについては、今後実装予定です。
				<code>let l:result = vimproc#system('ls')</code>
				vimprocを駆使すれば非同期実行をエミュレーションできますが、スレッドの存在しないVimでは使い方がとてもややこしいので、ここでは説明を省略します。
				興味がある場合にはvimprocのtestディレクトリにあるサンプルスクリプトを参照してください。
				ネットワーク通信もできるので、Twit.vimみたいなプログラムも簡単に作成できます。
				いずれはcomint-modeのように、インタプリタ実行機能を統合させたいと思っています。
				ちなみにVimScriptでのシェル実装である<a href="http://github.com/Shougo/vimshell/tree/master">vimshell</a>でも、vimprocを用いて非同期実行を行っています。</p>
				
				<h2>その他の非同期実行ライブラリ</h2>
				
				<p>その他のライブラリとして、vimprocやvimshellをもとにNico Raffatoさんが製作している<a href="http://www.vim.org/scripts/script.php?script_id=2771">Conque</a>というプラグインがあり、とても精力的に開発されています。Emacsのansi-term.elを目標にしているようで、動作が散漫なのが欠点ですが、多機能のようなので使用してみるといいかもしれません。</p>
				
				<h2><code>CursorHold</code>イベントの落とし穴</h2>
				
				<p>しかも、Vimには指定された時間が経過したら関数を呼び出すタイマー機能がありません。
				<code>CursorHoldI</code>や<code>CursorHold</code>イベントで代用するという手がありますが、これにはイベントごとに時間を設定できない、
				ポップアップが表示されているときは呼ばれない、カーソルが動くまで呼ばれないといった欠点があります。
				この欠点は本質的に回避不能です。Vim本体にタイマー実行機能が搭載されるのを待つしかありません。</p>
				
				<h2>clientserver機能を使う</h2>
				
				<p>Vimのclientserver機能を用いると、処理が完了した際に機能を呼び出すコールバック機能を実装することが可能です。
				ただし、X環境が必要になります。Windows上でも使用できますが、あらかじめ別のVimを用意しておく必要があります。詳しくは<code>:help clientserver</code>を参照してください。</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack124/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #123: VimでSKK日本語入力環境を実現する</title>
		<link>http://vim-users.jp/2010/02/hack123/</link>
		<comments>http://vim-users.jp/2010/02/hack123/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 15:00:06 +0000</pubDate>
		<dc:creator>hatena.ne.jp/tyru/</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1357</guid>
		<description><![CDATA[				Emacsでは様々な日本語入力のプラグインがあります。
				Vimでもkeymapなどの設定をいじれば可能ですが、
				あまりkeymapファイルをいじった人は少ないでしょう。
				そこでVimプラグ [...]]]></description>
			<content:encoded><![CDATA[				<p>Emacsでは様々な日本語入力のプラグインがあります。<br />
				Vimでもkeymapなどの設定をいじれば可能ですが、<br />
				あまりkeymapファイルをいじった人は少ないでしょう。<br />
				そこでVimプラグインで日本語入力を実現しようと開発された、skk.vimを紹介します。</p>
				
				<h1>概要</h1>
				
				<p>skk.vimはYagi Noriaki氏によって作られたVimで日本語入力を実現するプラグインで、以下のような特徴を持ちます。</p>
				
				<ul>
				<li>SKKによる日本語入力を実現する</li>
				<li><code>so skk.vim</code>のみで動作する (Windows環境では辞書ファイルのパスが異なるため、別途設定を.vimrcに書く必要があります)</li>
				<li>軽い</li>
				</ul>
				
				<p>SKKについて簡単に説明すると、形態素解析（文節の区切り）をSKK自身が行わず、<br />
				使用者自身が行うように矯正することで、実装が簡単であり、<br />
				かつ慣れれば高速で正確なかな漢字変換が行えるInput Methodです。</p>
				
				<p>形態素解析を行わないことで軽い動作を実現し、
				かつ自分の意図した変換結果を得られやすいとされています。<br />
				詳しくは各自Wikipediaを見るなりググったりしてください。</p>
				
				<h1>導入</h1>
				
				<h2>SKKの辞書を用意する</h2>
				
				<p><a href="http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1">ここ</a>からダウンロードするか、Linuxだったら</p>
				
				<pre><code>skkdic skkdic-extra
</code></pre>
				
				<p>のようなパッケージが用意されていればそれをインストールしてください。</p>
				
				<h2>skk.vim インストール</h2>
				
				<p>普通のVimプラグインと違いはありません。<br />
				<a href="http://www.vim.org/scripts/script.php?script_id=1589">www.vim.org</a>から最新版をダウンロードして解凍してVimのディレクトリにインストールするだけです。</p>
				
				<h1>メリット</h1>
				
				<ul>
				<li>sshのリモートホスト先で日本語入力ができない時もVim上で日本語を入力できる</li>
				<li>軽い</li>
				<li>自分の意図にあった変換をしてくれる(かもしれない)</li>
				</ul>
				
				<h1>デメリット</h1>
				
				<ul>
				<li>他のInput Methodには戻れない</li>
				<li>SKK信者で<del>Vim信者</del>Vimmerは母数的に考えて少ない(要出典)</li>
				</ul>
				
				<p>・・・はネタとして</p>
				
				<ul>
				<li>Vimでしか使えない</li>
				</ul>
				
				<p>MacならAquaSKK、Windowsならskkime、Linuxならuim-skkやscim-skkなど、<br />
				それぞれのOSのIMを変えてしまえばどのアプリケーションでも使えます。
				ただ上で言った「sshのリモートホスト先で日本語入力ができない時もVim上で日本語を入力できる」は大きなメリットだと思います。<br />
				緊急時に備えてインストールしておくのもアリかもしれません。</p>
				
				<ul>
				<li>SKKは人によっては慣れが必要かもしれない</li>
				</ul>
				
				<p>SKKでもmecab-skkservというものを使えば普通の日本語入力と似た環境を手に入れられますが、残念ながらskk.vimはskkserv非対応です。</p>
				
				<h1>これまでのあらすじ</h1>
				
				<p>しかしskk.vimには一つ問題があり、
				それはもう作者によるメンテナンスが行われていないことです。<br />
				skk.vimにはファンも多く、インターネット上でも野良パッチが散見されますが、<br />
				それらは本家にマージされることはなく
				www.vim.orgでの最終更新日は2006年10月15日で止まっています。</p>
				
				<p>そんな中私はこの状況をなんとかしたいといった気持ちはまったくなく、<br />
				ふとした思いつきからGithubにskk.vimの改良版を登録し、それが一部の人の反響を受けます。(要出典)<br />
				気を良くした私は、勢いで作者である八木氏とメールで連絡をし、<br />
				ライセンスの確認と、メンテナンスの意志があるか、<br />
				また今後作者に無断で登録してしまったリポジトリに継続してコミットしていいかを尋ねました。<br />
				八木氏はこれに快く了承して、ライセンスは好きにしていいと仰ってくれました。</p>
				
				<p>無事八木氏の了解が得られ、どんどんskk.vimのパッチをマージしていこうと考えたものの、<br />
				skk.vimがVimスクリプトの貧弱な時代に書かれたものだったため、互換性を維持するためのコードが散らばっていました。</p>
				
				<p>ドキュメントはなんとか書いたものの、Vim6時代のコードを知らないために、変更をすることに怖気づいていたところ、<br />
				リポジトリのメンバーからもコードを一から書き直す必要があるとの声が高まってきます。<br />
				私はそれを喜んで賛成し、skk.vimのメンテナンスを続けることを約束しながらも、結局新しいskk.vimを作ることにしました。</p>
				
				<h1>skk7.vim (仮称)</h1>
				
				<p>新しいskk.vimは、今現在skk7.vimという仮称のもと開発が行われています。<br />
				それは今私のマシン上、完璧クローズドな環境で行われていて、<br />
				未だベータ版ですが、近々Githubに登録するつもりです。</p>
				
				<p>しかしskk7.vimというのはあくまで仮称であって、正式名称ではありません。<br />
				未だ<a href="http://d.hatena.ne.jp/tyru/20100131/list_of_names_of_new_skk_vim">続々と希望が寄せられている</a>ものの、そもそも多数決で決めるのか、独断で決めるのか、それすらも決めていませんでした。</p>
				
				<h1>というわけで</h1>
				
				<ul>
				<li>新しい名前希望！
				
				<ul>
				<li>決め方は決めるつもり</li>
				</ul></li>
				<li>skk.vimかskk7.vimの開発に興味があるなら、私かリポジトリのメンバーになんらかのコンタクトをとってくれれば、すぐにメンバーに招待したい
				
				<ul>
				<li>GithubのIDを取得している必要があります</li>
				<li>参加表明して何もしなくてもOKな気楽っぷり</li>
				<li>気が向いた時に機能追加なり修正を新しいブランチにプッシュしてもらえれば適当に拾ってマージします</li>
				</ul></li>
				<li>その他要望等あれば下の連絡先からどうぞ</li>
				</ul>
				
				<h1>連絡先</h1>
				
				<ul>
				<li><a href="http://twitter.com/tyru">Twitter</a></li>
				<li><a href="http://d.hatena.ne.jp/tyru/">はてな</a></li>
				<li>tyru.exe@gmail.com</li>
				</ul>
				
				<h1>参考リンク</h1>
				
				<ul>
				<li><a href="http://github.com/tyru/skk.vim">skk.vimのリポジトリ</a></li>
				<li><a href="http://openlab.ring.gr.jp/skk/index-j.html">SKK Openlab</a></li>
				</ul>
				
				<address class="hack-author">tyru</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack123/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #122: 行末までヤンクする</title>
		<link>http://vim-users.jp/2010/02/hack122/</link>
		<comments>http://vim-users.jp/2010/02/hack122/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 15:00:28 +0000</pubDate>
		<dc:creator>ujihisa</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv1]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1349</guid>
		<description><![CDATA[				問題
				
				カーソル位置から行末まで削除するにはDします。
				カーソル位置から行末まで編集する(削除して挿入モードに入る)にはCします。
				
				さて、カーソル位置から行末までヤンクす [...]]]></description>
			<content:encoded><![CDATA[				<h2>問題</h2>
				
				<p>カーソル位置から行末まで削除するには<kbd>D</kbd>します。
				カーソル位置から行末まで編集する(削除して挿入モードに入る)には<kbd>C</kbd>します。</p>
				
				<p>さて、カーソル位置から行末までヤンクするにはどうすればいいでしょうか。
				答えは<kbd>Y</kbd>ではなく、<kbd>y$</kbd>です。</p>
				
				<p>Vimの<kbd>Y</kbd>の挙動は、「カーソル行をヤンク」です。カーソル位置より左もまとめてヤンクされてしまいます。
				オリジナルのviとの互換性のためか、このような仕様になっているみたいです。
				オリジナルのviがなぜこのような仕様になっているかは不明です。</p>
				
				<h2>解決</h2>
				
				<p><code>~/.vimrc</code>に以下を記述します。</p>
				
				<pre><code>nnoremap Y y$
</code></pre>
				
				<p>これで、<kbd>Y</kbd>の挙動が<kbd>D</kbd>や<kbd>C</kbd>と同様に、「カーソル位置から行末までヤンクする」になります。
				一貫性がとれる上に、<code>$</code>というとても人間には入力不可能な記号の入力を省略することができ、開発効率の大幅な向上が期待されます。</p>
				
				<h2>解説</h2>
				
				<p>なお、ヘルプ <code>:h Y</code> を引くと以下のように説明されています。</p>
				
				<blockquote>
				<p><code>[&quot;x]Y</code> yank <code>[count]</code> lines <code>[into register x]</code> (synonym for
				<code>yy, |linewise|</code>). If you like <code>&quot;Y&quot;</code> to work from the
				cursor to the end of line (which is more logical,
				 but not Vi-compatible) use <code>&quot;:map Y y$&quot;</code>.</p>
				</blockquote>
				
				<p>しかし、このやりかたは2点留意事項があります。</p>
				
				<ul>
				<li>ヘルプに書いている方法ですと、<kbd>y</kbd>や<kbd>$</kbd>の挙動が上書きされているときに、上書きされた側の挙動で今回定義した<kbd>Y</kbd>が実行されます。多くの場合それは意図した挙動ではないため、本Hackでは<code>map</code>ではなく<code>noremap</code>としました</li>
				<li>ビジュアルモードなどでは今回の<kbd>Y</kbd>は関係ないため、<code>map</code>ではなく<code>nmap</code>がより好ましいです</li>
				</ul>
				
				<p>組み合わせて、本Hackでは<code>nnoremap</code>としました。</p>
				
				<address class="hack-author">ujihisa</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack122/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #121: バッファ名をペーストする</title>
		<link>http://vim-users.jp/2010/02/hack121/</link>
		<comments>http://vim-users.jp/2010/02/hack121/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 15:00:00 +0000</pubDate>
		<dc:creator>kana</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[lv1]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1291</guid>
		<description><![CDATA[				問題
				
				ときおりバッファ名をペーストしたいことがあります。
				短い名前なら手動で入力しても構いませんし、
				ファイルに対応するバッファならばファイル名補完で多少の手間を省けますが、
	 [...]]]></description>
			<content:encoded><![CDATA[				<h3>問題</h3>
				
				<p>ときおりバッファ名をペーストしたいことがあります。
				短い名前なら手動で入力しても構いませんし、
				ファイルに対応するバッファならばファイル名補完で多少の手間を省けますが、
				面倒臭いことには変わりありません。
				直接バッファ名をペーストできないでしょうか。</p>
				
				<h3>解決方法</h3>
				
				<p>Normal modeの場合は以下のコマンドを実行します:</p>
				
				<pre><code>"%p
</code></pre>
				
				<p>Insert modeやCommand-line modeの場合は以下のコマンドを入力します:</p>
				
				<pre><code>&lt;C-r&gt;%
</code></pre>
				
				<p>上記のコマンドはカレントバッファ名をペーストします。
				<code>%</code>の代わりに<code>#</code>を用いると
				<a href="http://vimdoc.sourceforge.net/htmldoc/editing.html#alternate-file">代替バッファ</a>
				の名前をペーストします。</p>
				
				<h3>解説</h3>
				
				<p>上記のコマンドは実際には指定されたレジスタの内容をペーストするコマンドです。
				Vimには特殊なレジスタとしてカレントバッファ名や代替バッファ名を表すものがあり、
				この二つを組み合わせることで上記のようにバッファ名のペーストができます。</p>
				
				<p>Vimには他にも様々な
				<a href="http://vimdoc.sourceforge.net/htmldoc/change.html#registers">特殊レジスタ</a>
				があるので、一度確認しておくとより便利に使うことができるでしょう。</p>
				
				<h3>参考資料</h3>
				
				<ul>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/change.html#p">:help p</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/insert.html#i_CTRL-R">:help i_CTRL-R</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/cmdline.html#c_CTRL-R">:help c_CTRL-R</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/change.html#registers">:help registers</a></li>
				<li><a href="http://vimdoc.sourceforge.net/htmldoc/editing.html#alternate-file">:help alternate-file</a></li>
				</ul>
				
				<address class="hack-author">kana</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2010/02/hack121/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
