<?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 script</title>
	<atom:link href="http://vim-users.jp/tag/vimscript/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.3.1</generator>
	<atom:link rel='hub' href='http://vim-users.jp/?pushpress=hub'/>
		<item>
		<title>Vimテクニックバイブル紹介(Shougo版)</title>
		<link>http://vim-users.jp/2011/08/vim-technic-bible-shougo/</link>
		<comments>http://vim-users.jp/2011/08/vim-technic-bible-shougo/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 03:10:14 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[Vim script]]></category>
		<category><![CDATA[告知]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[lv1]]></category>
		<category><![CDATA[lv2]]></category>
		<category><![CDATA[lv3]]></category>
		<category><![CDATA[neocomplcache]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[quickrun]]></category>
		<category><![CDATA[unite]]></category>
		<category><![CDATA[vimproc]]></category>
		<category><![CDATA[vimshell]]></category>
		<category><![CDATA[Vimテクニックバイブル]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2528</guid>
		<description><![CDATA[この記事について この記事は、開発環境勉強会における「Vimテクニックバイブル」紹介スライドの完全版です。 「Vimテクニックバイブル」については、taku&#95;oさんやmattnさんなども記事を書いていますが、 私 [...]]]></description>
			<content:encoded><![CDATA[				<h1>この記事について</h1>
				
				<p>この記事は、開発環境勉強会における「Vimテクニックバイブル」紹介スライドの完全版です。
				「Vimテクニックバイブル」については、taku&#95;oさんやmattnさんなども記事を書いていますが、
				私の場合はできるだけ本の内容に触れたものにしています。
				これを読んでVimテクニックバイブルを購入していただける人が増えれば、著者達にとって最高の喜びです。</p>
				
				<h1>Vimテクニックバイブルができた背景</h1>
				
				<p>以前にもブログの記事で触れていますが、Vim界には良質な記事や書籍が不足しています。
				特に、まともにVim scriptを書ける人が書いた書籍がほとんどありません。
				これはVim界の大きな損失であり、Vim scriptプログラマーが育たない大きな原因となっています。
				私がVim勉強会に参加すると、必ずといっていいほど聞かれるのが
				「Shougoさんは、Vimの書籍を書かないんですか？」ということです。
				この声になかなか答えられないのは悲しいものがありました。</p>
				
				<p><a href="http://vim-users.jp/wp-content/uploads/vim_cover.jpg"><img src="http://vim-users.jp/wp-content/uploads/vim_cover-244x300.jpg" alt="Vimテクニックバイブル" title="Vimテクニックバイブル" width="244" height="300" class="alignnone size-medium wp-image-2530" /></a></p>
				
				<p>と、いうことで……今年ついにVimの書籍が刊行されます！
				書名は「Vimテクニックバイブル」です。
				中身は「Emacsテクニックバイブル」のVim版となっており、イメージカラーは当然Vimグリーンです。
				そういえば、EmacsテクニックバイブルはEmacsブルー(パープル)でしたね。
				キャッチコピーは、「unite.vimで進化する新しいVimの常識を教えます。あなたはVimの本当の姿を知っていますか？」
				Emacsテクニックバイブルとは違い、unite.vimを全面に押し出しています。</p>
				
				<h1>執筆者紹介</h1>
				
				<p>執筆陣はかなり豪華です。おそらく、これだけの人達が一冊の書籍を作るために集まることはもうないでしょう。</p>
				
				<h2>taku_o</h2>
				
				<p>人気サイト「名無しのVim使い」の管理人です。雑誌にVimの記事を執筆したことがあります。
				サイトで紹介しているだけあって、様々なプラグインについて、かなりの知見を持っています。</p>
				
				<h2>yukimi</h2>
				
				<p>章の基礎知識や用語の統一など、細かいところで手伝ってもらっています。Vim使いです。</p>
				
				<h2>mattn</h2>
				
				<p>webapi-vimやzencoding.vimの作者です。他にも細かなプラグインを作っています。
				KaoriYaさんと同じく、昔からVimにパッチを多数送っており、Vimの内部実装や黒魔術に詳しいです。</p>
				
				<h2>thinca</h2>
				
				<p>quickrunやref.vim, scouter.vimなどの作者です。unite.vimのsourceやvital.vim, eskk.vimなどにも関わっています。
				Vim scriptにかなり詳しいです。</p>
				
				<h2>fuenor</h2>
				
				<p>QFixHowm, QFixGrep, JPFormat.vimの作者で、Vim-UTF8を配布しています。
				Windows環境での日本語の扱いについて詳しいです。</p>
				
				<h2>Shougo</h2>
				
				<p>neocomplcache, vimshell, vimproc, unite.vim, vimfilerなどを作っています。
				メンテナンスしているプラグインが多すぎて、なかなか時間が足りないのが悩みです。Vimは環境だと思っています。</p>
				
				<h1>内容紹介</h1>
				
				<p>もう執筆がほぼ終わっているため、中身は確定しています。プラグインの紹介を中心とした豪華な内容となるようにしました。
				紹介しているプラグインは定番からマイナーまで幅広く、作者自ら解説していることもあります。
				まだ発売まで期間があるため、詳しい目次を挙げることはできませんが、以下のような内容が含まれています。</p>
				
				<h2>vimfiler</h2>
				
				<p>vimfilerの使い方や、キーマッピング、マニアックなところではvimfilerを用いた拡張リネーム機能について解説しています。</p>
				
				<h2>netrw</h2>
				
				<p>netrwによる遠隔地ファイル編集、netrwによるブックマーク、netrwによるファイル操作が解説されています。</p>
				
				<h2>quickrun</h2>
				
				<p>quickrunの使い方、各種オプション、設定方法について解説されています。</p>
				
				<h2>ref.vim</h2>
				
				<p>ref.vimの使い方、各種sourceについて解説されています。</p>
				
				<h2>vimshell(インタプリタ通信機能を含む)</h2>
				
				<p>vimshellの使い方、よく使われる内部コマンド、vimshellのインタプリタ通信機能を解説しています。
				ちなみに、Emacsテクニックバイブルでは、eshellについて触れられていません。</p>
				
				<h2>Conque</h2>
				
				<p>Vimで端末を実現するプラグインであるConqueの使い方、vimshellとの違いについて解説しています。</p>
				
				<h2>skk.vim</h2>
				
				<p>SKKについて解説しています。eskk.vimも少しだけ書いてあります。それほどページはありません。</p>
				
				<h2>neocomplcache</h2>
				
				<p>neocomplcacheの使い方、設定方法、neocomplcacheのスニペット機能、スニペットの書き方、
				neocomplcacheのsourceの作り方と、大変豪華な内容となっています。
				以前Vim Hacksに書いた内容の完全版と言っても良いでしょう。</p>
				
				<h2>zencoding.vim</h2>
				
				<p>zencoding.vimの基本から、任意の言語への応用例まで挙げられています。</p>
				
				<h2>QFixHowm</h2>
				
				<p>QFixHowmの使い方、メモの作成方法、メモの検索、ToDo管理について解説されています。</p>
				
				<h2>QFixGrep</h2>
				
				<p>Windows環境のgrepの注意点についても解説されています。</p>
				
				<h2>JPFormat.vim</h2>
				
				<p>JPFormatによる日本語の整形方法について解説されています。</p>
				
				<h2>autodate.vim</h2>
				
				<h2>webapi-vim</h2>
				
				<p>VimからWebサービスを扱う方法について解説されています。</p>
				
				<h2>project.vim</h2>
				
				<p>project.vimによるプロジェクト管理やproject.vimの設定方法について解説されています。</p>
				
				<h1>Vim scriptが分からない初心者でも安心！</h1>
				
				<p>Vimの設定や、Vim pluginについての解説を中心とした書籍となっていますが、
				ある程度のVim scriptの知識は必要不可欠です。
				そこで、次のような項目について解説しています。
				これ以上の詳しい解説については、Vimのヘルプを参照してください。</p>
				
				<h2>:helpの読み方</h2>
				
				<p>Vimの:helpをすぐに引けるかどうかは、初心者と初級者を分ける大変重要なファクターとなっています。
				この本では、Vimの:helpの使い方について解説しています。</p>
				
				<h2>Vim script基礎文法最速マスター(改訂版)</h2>
				
				<p>これは、thincaさんが以前ブログで書いていた「Vim script基礎文法最速マスター」の改訂版です。
				Vim scriptについて一通り学ぶことができます。</p>
				
				<h2>マッピングについて</h2>
				
				<p>Vimのキーマッピングは大変ややこしいですが、詳しく解説しています。</p>
				
				<h2>オプションについて</h2>
				
				<p>Vimのオプションには落とし穴が多数あります。Vimのオプションにおける仕様について解説しています。</p>
				
				<h2>Vimプラグインの管理</h2>
				
				<p>Vimのプラグインをインストールするなら、パッケージマネージャは必要不可欠です。
				定番のVundle, pathogenから、vimballに至るまで解説をしています。</p>
				
				<h2>テキストオブジェクト</h2>
				
				<p>最近のVimを語るにはなくてはならない機能です。
				テキストオブジェクトの拡張についても触れられています。</p>
				
				<h2>QuickFix</h2>
				
				<p>grepやmakeには欠かせない機能です。</p>
				
				<h2>:autocmd</h2>
				
				<h2>外部インタフェース</h2>
				
				<p>ちょっとレベルが高いですが、Perl, Pythonの外部インタフェースについて解説されています。</p>
				
				<h1>最近のVimといえば、unite.vimは外せないよね！</h1>
				
				<p>当然unite.vimについては、1つのChapterを贅沢に使用して解説しています。
				Emacsテクニックバイブルはanything.elについて2つのChapterを使っているので、そちらよりは若干量が減ります。
				それでも、30ページくらいはあるため、十分満足できると思います。
				unite.vimの章では、次の内容を解説しています。
				これを読めばあなたもunite.vimマスターに！</p>
				
				<h2>vimfiler, vimshellなどといった他のプラグインとの連携</h2>
				
				<h2>unite.vimの有用なsource</h2>
				
				<h2>カスタマイズ方法についての解説</h2>
				
				<p>unite.vimの各種オプションについて、解説しています。
				マニアックなところでは、buffer-name-optionについての解説もあります。</p>
				
				<h2>source, kind, action, filterの解説</h2>
				
				<p>特にsourceを自作する場合、source, kind, action, filterの概念は重要です。それぞれの仕様について詳しく解説しています。
				作者が自ら書いているため、情報が正確で安心です。</p>
				
				<h2>sourceの作り方まで載っている！</h2>
				
				<p>サンプルsourceの作り方が書いてあります。マニアックなところでは、非同期sourceの仕様についても書いています。</p>
				
				<h2>unite.vim Ver.2.2対応(一応)</h2>
				
				<p>一応最新版のunite.vimの仕様に準拠しています。残念ながら、あまりにも新しい機能は解説できていません。
				不変的な情報に絞って解説しています。
				現在開発中のunite.vim Ver.3.0について少しだけ触れています。</p>
				
				<h1>もちろん、Emacsの人達にもオススメ</h1>
				
				<p>EmacsテクニックバイブルがVimmerにも有用な本であったように、
				当然VimテクニックバイブルはEmacsを使っている方々にもオススメです。
				Emacsを使っている人も、異文化交流は重要です。
				同じ環境で満足していたら、何も生まれません。
				auto-complete.elもVimの補完機能を参考にしています。
				つまり、Emacs使いであってもVimや他のエディタからも刺激を受けるべきなのです。
				この本を読めば、最近のVimの機能やプラグインについて分かります。
				例えば、unite.vimとanything.elの違いが分かります。
				新人にVimを教えざるをえないときにも使えます。
				さらに、一身上の理由により、Vimに乗り換えざるをえないときもVimテクニックバイブルの知識があれば安心ですね。</p>
				
				<h1>現在確定している情報</h1>
				
				<p>ページ数は384Pで、Emacsテクニックバイブルと同じです。
				値段は￥2, 980+税です。基本的に技術書というのは、￥3000を越えると購入までのハードルが上がってしまいます。
				ページをできるだけ減らしたこともあり、税抜きでなんとか￥3000は切ったのですが、若干Emacsテクニックバイブルより高くなってしまいました。
				発売日は9月中旬予定ですが、詳しい日付けの確定はしていません。
				目次については、八月中に確定する予定なので、九月には詳しい情報が出せるでしょう。
				まだ発売まで時間があるので、しばらくお待ちください。</p>
				
				<h1>残念ながら載せられなかった内容</h1>
				
				<p>できるだけ、著名なプラグインは載せるように心がけましたが、
				ページ数の都合やその他様々な理由により載せられなかったプラグインがあります。
				ここではそれらについて紹介します。</p>
				
				<h2>VCSとの連携</h2>
				
				<p>VCSと連携できるプラグインとしては、git-vimやfugitive.vimがありますが、決定版と呼べるようなものがなかったためです。
				vcs.vimが候補だったんですが、未完成でした。</p>
				
				<h2>shadow.vim</h2>
				
				<p>時間とページ数の都合が付きませんでした。</p>
				
				<h2>snipMate</h2>
				
				<p>neocomplcacheのスニペット機能で十分だったためです。解説する人もいませんでした。
				ちなみに、snippetsEmuはページ数が足りませんでした。</p>
				
				<h2>echodoc</h2>
				
				<p>入れてもよかったんですが、他のTipsが削られすぎて入れる暇がありませんでした。</p>
				
				<h2>netrwについての詳しい解説</h2>
				
				<p>時間とページ数の都合がつきませんでした。
				ただし、一部のTipsでnetrwの機能について触れられています。</p>
				
				<h2>metarw</h2>
				
				<p>使っている人があまりに少ないため削られました。metarwがやっていることは、vimfiler+unite.vimでできるようになる予定です。</p>
				
				<h2>vimprocの使い方について</h2>
				
				<p>書籍では簡単にvimprocについて触れていますが、さすがに詳しい解説はできませんでした。
				想定読者にとっては難しすぎるからです。vimprocをバリバリ使えるような層では、Vim scriptから使い方を解読するのも簡単だと思います。</p>
				
				<h2>vital.vim</h2>
				
				<p>このプラグインは、プラグイン制作者のためのものです。この本の対象読者にはレベルが高すぎました。
				それに、ページ数の余裕もありませんでした。</p>
				
				<h1>内容の陳腐化への懸念について</h1>
				
				<p>書籍は生物です。コンピュータに関する書籍は出たばかりのときに購入しておかないと、役に立つ前に時代遅れとなってしまうでしょう。
				だからこの本が必要なら、発売されたらすぐに購入するのが適切です。特に、一度絶版になってしまったら取り返しがつきません。
				本の売り上げが上がると、出版社に対するVimへの印象が良くなり、続編などが企画されるかもしれません:-)</p>
				
				<p>特に私のプラグインは進化が早いため、本が出たらすぐに時代遅れとならないか心配してくれている人がいるようです。
				はい。それは正しい指摘です。
				ただ、私もそのことは分かっていました。だからわざと新しすぎる機能や、あまり使われない機能については本の中では解説せず、
				「適時:helpを参照してください」ということになっています。できるだけ不変であろうことについて解説するようにしています。
				それでも現在の実装と齟齬がでてきてしまった場合は、正誤表にて何かしらのフォローをする予定です。</p>
				
				<h1>「:helpに全部書いてあるから書籍は必要ない」という意見について</h1>
				
				<p>これはある意味事実です。だからこそ、本の対象とする読者は「Vimの基本的な操作や設定はできるが、:helpを自在に引くことはできない層」なのです。
				:helpはリファレンスマニュアル的であり、分からない語句を検索するときに使います。
				初心者が通読するには向いていません。
				本というのは初心者が参照しやすいように、重要な情報をふるい分けることに価値があると考えています。</p>
				
				<p>ただし、私が自分の記事の中で気をつけたのは、できるだけ「設計思想や使い方について解説をする」ことです。
				これは:helpに書いていないことが多いうえに、内容が陳腐化することも少ないと考えました。
				だから、ヘルプを自由自在に参照することができる、レベルが高いVim使いにとっても役立つ書籍だとは思います。
				これが本当かどうかは、自分の目で本を見て確認してください。</p>
				
				<h1>なぜ「Vimテクニックバイブル」はVim scriptを学ぶ本ではないのか</h1>
				
				<p>それは需要がないからです。考えてみてください。あなたの周囲にVim scriptをバリバリ書けるような人はいますか？
				Vimが好きだから、Vim scriptを本格的に学びたいと考えている人はいますか？
				まずいないでしょう。「Vimテクニックバイブル」の内容ですら出版社からはリスクがあると考えられている現状において、
				日本でVim scriptを学ぶための書籍が出る確率は0です。おそらく売れません。
				「Vimテクニックバイブル」にはVim scriptの解説がある程度書いてあります。
				しかし、一流のVim scripterになるための道はまだまだ険しいのです。</p>
				
				<p>それでもVim script本の構想を諦めきれない場合は、まず「Vimテクニックバイブル」を購入し、その本に書いてあることを全てマスターしてください。
				さらに「Vimテクニックバイブル」を周囲に宣伝し、全国のVimmerのVimレベルを上昇させてください。
				その暁には、Vim script本の出版リスクは低減され、いつの日か発売されるかもしれません。</p>
				
				<h1>オマケ</h1>
				
				<p>今後、vim-users.jpで「Vimテクニックバイブル」に関する何かが掲載されるかもしれません。こうご期待！
				ちなみに、Vimテクニックバイブルを購入してもらった場合、勉強会でShougoのサインが貰えるかもしれませんよ！</p>
				
				<address class="hack-author">Shougo</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/08/vim-technic-bible-shougo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #213: ダブルクリックで単語検索するようにする</title>
		<link>http://vim-users.jp/2011/04/hack213/</link>
		<comments>http://vim-users.jp/2011/04/hack213/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 15:00:16 +0000</pubDate>
		<dc:creator>hatena.ne.jp/tyru/</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[Vim script]]></category>
		<category><![CDATA[lv3]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2323</guid>
		<description><![CDATA[きっかけ Vimユーザの方は一日を端末で過ごしている方も多いでしょう。 しかしマウスとはとても便利なものです。 トラックボールを使ったりすると新しい発見があるかもしれません。 キーボードで操作している時はキーボードで操作 [...]]]></description>
			<content:encoded><![CDATA[				<h2>きっかけ</h2>
				
				<p>Vimユーザの方は一日を端末で過ごしている方も多いでしょう。
				しかしマウスとはとても便利なものです。
				トラックボールを使ったりすると新しい発見があるかもしれません。</p>
				
				<p>キーボードで操作している時はキーボードで操作でき、
				マウスで操作している時はマウスで最低限の操作はできるというのが理想です。
				最低限の操作とは何でしょうか。
				<!-- 編集するとしたらもちろんキーボードに手を伸ばさなければなりませんが -->
				結論から言いますと、あなたがマウスでコードを見ている時必要だと思うことは、大半が単語検索でしょう。</p>
				
				<ul>
				<li>離れた所にある同じ単語に飛ぶ</li>
				<li>変数がどこで定義されているか調べる</li>
				<li>検索目的ではなくバッファ中にあるテキストをハイライトさせたい</li>
				</ul>
				
				<p>など単語検索でできることは実に様々です。</p>
				
				<p>自分は普通にコードを書いている時でも<code>/</code>コマンドをよく使います。
				移動の80%はこれといっていいかもしれません。
				言い過ぎだとしても70割かもしれません。
				それほど汎用的なコマンドなのです。</p>
				
				<h2>(脱線) IDEの場合</h2>
				
				<p>IDEだとしたら変数にマウスオーバーした時点で定義場所などの情報がポップアップで表示されるかもしれません。
				ただこういう機能は「便利すぎて」ユーザが能動的に情報を探そうとした場合邪魔になることが多いと思うのです。
				ちなみにマウスオーバーした時点でポップアップするようなIDEを筆者は知りません。勘で言いました。</p>
				
				<p>自動補完にもこういう側面があると私は思います。
				キーをタイプしたらポップアップがめまぐるしく表示され、
				頭の中にあったコードがデリートされてしまうなどといったことがありました。</p>
				
				<p>Twitterでチカチカしたアイコンをした人をフォローしてる人には身に覚えがあるかもしれませんが、
				気分転換にTwitterを見たらTLにアイコンがチカチカした人がいてとても気分を害されたということがあります。
				この対処法としてはtermtterなどの画像が表示されないTwitterクライアントを使うことです。
				ちなみにTwitter社はサードパーティ製クライアントを<a href="http://slashdot.jp/it/article.pl?sid=11/03/14/1012231">推奨していません</a>。</p>
				
				<p>ちなみに筆者は以前自動補完はあまり好きではありませんでしたが慣れました。
				自動補完プラグインとしては<a href="http://www.vim.org/scripts/script.php?script_id=1879">autocomplpop</a>、<a href="https://github.com/Shougo/neocomplcache/">neocomplcache</a>というプラグインが代表的です。
				自動補完はとても便利な機能なのでぜひ使いましょう。</p>
				
				<h2>閑話休題</h2>
				
				<p>無理矢理話を戻すと、マウスでの単語検索を快適にするために必要な設定を本稿では解説したいと思います。</p>
				
				<h2>ダブルクリックへのマッピング</h2>
				
				<p>ダブルクリックへのマッピングは<code>&lt;2-LeftMouse&gt;</code>を使えばできます。</p>
				
				<pre><code>nnoremap &lt;2-LeftMouse&gt; g*
</code></pre>
				
				<p>これで終わりでしょうか？いいえ、<!-- こだまです -->まだです。</p>
				
				<p>これだとダブルクリックをしようとした時、
				シングルクリック(<code>&lt;LeftMouse&gt;</code>)の時点で<code>&lt;LeftMouse&gt;</code>本来の操作、
				つまりクリックした場所にカーソルを移動、が実行されてしまうのです。
				カーソルが移動するのは多いに結構なのですが、
				問題は<code>'scrolloff'</code>の設定も効いてしまうことです。</p>
				
				<p><code>'scrolloff'</code>は正の値をセットするとカーソルの上部か下部が
				常に<code>'scrolloff'</code>分の行だけ表示されるようになるという非常に便利なオプションですが、
				これがマウスのシングルクリックの時に効いてしまうと</p>
				
				<ol>
				<li>シングルクリック (クリック1回目)</li>
				<li>カーソル移動</li>
				<li>&#8216;scrolloff&#8217;分だけ行を開ける</li>
				<li>表示領域がずれて、マウスカーソルが指していた場所にあった単語も移動してしまう</li>
				<li>ダブルクリック (クリック2回目)</li>
				<li>検索するつもりじゃなかった単語を検索してしまう</li>
				<li>一瞬何が起こったのか分からない</li>
				<li>理解し悲しみに暮れる</li>
				</ol>
				
				<p>ということになり非常に悲しいです。
				そして「9.Vimを<!-- 調教 --><!-- setq -->説得する」というのがこの記事を書くに至るまでの過程でした。
				ちなみに説得というのはEmacsで言うsetqとかけています。</p>
				
				<p><!--
				少しダブルクリックまで待ってくれればいいのですが、
				`&lt;LeftMouse&gt;`と`&lt;2-LeftMouse&gt;`は違うマッピングなので
				`'timeout'`などのオプションは適用されないのです。
				-->
				<!-- これはひどい。いやマジで -->
				<!-- あれ？これ&lt;2-LeftMouseが&lt;LeftMouse&gt;&lt;LeftMouse&gt;だったらよかったんじゃね？ --></p>
				
				<h2><code>'scrolloff'</code>の再実装 〜yak shaving〜</h2>
				
				<p>これを解決するには、つまりシングルクリック(<code>&lt;LeftMouse&gt;</code>)時の移動を抑制すればいい訳です。
				しかし<code>'scrolloff'</code>は設定しておきたい。
				ならば<code>'scrolloff'</code>がやることをVimスクリプトで再実装して制御可能にし、一時的に無効にすればいい訳です。
				以下がその<code>'scrolloff'</code>の実装です。
				<code>'scrolloff'</code>オプションの代わりに<code>g:scrolloff</code>グローバル変数で指定するようになっています。</p>
				
				<pre><code>set scrolloff=0
let g:scrolloff = 15

" Hack for &lt;LeftMouse&gt; not to adjust ('scrolloff') when single-clicking.
" Implement 'scrolloff' by auto-command to control the fire.
autocmd vimrc CursorMoved * call s:reinventing_scrolloff()
let s:last_lnum = -1
function! s:reinventing_scrolloff()
    if s:last_lnum &gt; 0 &amp;&amp; line('.') ==# s:last_lnum
        return
    endif
    let s:last_lnum = line('.')
    let winline     = winline()
    let winheight   = winheight(0)
    let middle      = winheight / 2
    let upside      = (winheight / winline) &gt;= 2
    " If upside is true, add winlines to above the cursor.
    " If upside is false, add winlines to under the cursor.
    if upside
        let up_num = g:scrolloff - winline + 1
        let up_num = winline + up_num &gt; middle ? middle - winline : up_num
        if up_num &gt; 0
            execute 'normal!' up_num."\&lt;C-y&gt;"
        endif
    else
        let down_num = g:scrolloff - (winheight - winline)
        let down_num = winline - down_num &lt; middle ? winline - middle : down_num
        if down_num &gt; 0
            execute 'normal!' down_num."\&lt;C-e&gt;"
        endif
    endif
endfunction
</code></pre>
				
				<p>そしてこれは<code>:autocmd</code>を使って実装されているので
				以下のように<code>'eventignore'</code>オプションという
				Vimスクリプトを書いているような人しか知らないオプションを使って
				一時的に無効にできます。</p>
				
				<pre><code>nnoremap &lt;silent&gt; &lt;LeftMouse&gt; &lt;Esc&gt;:set eventignore=all&lt;CR&gt;&lt;LeftMouse&gt;:set eventignore=&lt;CR&gt;
</code></pre>
				
				<h2>visualstar.vim</h2>
				
				<p>ここまででも十分ですが、マウスで選択し、クリックで検索できたらどんなに良い事でしょうか。
				<a href="https://github.com/thinca/vim-visualstar">visualstar.vim</a>を使えばそれができます。</p>
				
				<pre><code>vmap &lt;LeftMouse&gt; &lt;Plug&gt;(visualstar-g*)
</code></pre>
				
				<h2>まとめ</h2>
				
				<p>ここまでのまとめとして、以下を.vimrcに貼り付ければ完了です。</p>
				
				<pre><code>set scrolloff=0
let g:scrolloff = 15

" Hack for &lt;LeftMouse&gt; not to adjust ('scrolloff') when single-clicking.
" Implement 'scrolloff' by auto-command to control the fire.
autocmd vimrc CursorMoved * call s:reinventing_scrolloff()
let s:last_lnum = -1
function! s:reinventing_scrolloff()
    if s:last_lnum &gt; 0 &amp;&amp; line('.') ==# s:last_lnum
        return
    endif
    let s:last_lnum = line('.')
    let winline     = winline()
    let winheight   = winheight(0)
    let middle      = winheight / 2
    let upside      = (winheight / winline) &gt;= 2
    " If upside is true, add winlines to above the cursor.
    " If upside is false, add winlines to under the cursor.
    if upside
        let up_num = g:scrolloff - winline + 1
        let up_num = winline + up_num &gt; middle ? middle - winline : up_num
        if up_num &gt; 0
            execute 'normal!' up_num."\&lt;C-y&gt;"
        endif
    else
        let down_num = g:scrolloff - (winheight - winline)
        let down_num = winline - down_num &lt; middle ? winline - middle : down_num
        if down_num &gt; 0
            execute 'normal!' down_num."\&lt;C-e&gt;"
        endif
    endif
endfunction

" Do not adjust current scroll position (do not fire 'scrolloff') on single-click.
nnoremap &lt;silent&gt; &lt;LeftMouse&gt;   &lt;Esc&gt;:set eventignore=all&lt;CR&gt;&lt;LeftMouse&gt;:set eventignore=&lt;CR&gt;
" Double-click for searching the word under the cursor.
nnoremap          &lt;2-LeftMouse&gt; g*
" Single-click for searching the word selected in visual-mode.
vmap              &lt;LeftMouse&gt; &lt;Plug&gt;(visualstar-g*)
</code></pre>
				
				<!--
				キーボードだってマウスだって声だって使える。
				そう、Vimならね。
				-->
				
				<address class="hack-author">tyru</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/04/hack213/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hack #203: 定義されているマッピングを調べる</title>
		<link>http://vim-users.jp/2011/02/hack203/</link>
		<comments>http://vim-users.jp/2011/02/hack203/#comments</comments>
		<pubDate>Sun, 27 Feb 2011 08:29:16 +0000</pubDate>
		<dc:creator>hatena.ne.jp/tyru/</dc:creator>
				<category><![CDATA[Vim Hacks]]></category>
		<category><![CDATA[Vim script]]></category>
		<category><![CDATA[lv2]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=2213</guid>
		<description><![CDATA[定義されているマッピングを調べたくなった時はないでしょうか。 このプラグインが作ったバッファではどんなマッピングが定義されているのか 変なマッピングが定義されていないか Vimプラグインの作者と会話していてマッピングを調 [...]]]></description>
			<content:encoded><![CDATA[				<p>定義されているマッピングを調べたくなった時はないでしょうか。</p>
				
				<ol>
				<li>このプラグインが作ったバッファではどんなマッピングが定義されているのか</li>
				<li>変なマッピングが定義されていないか</li>
				<li>Vimプラグインの作者と会話していてマッピングを調べるように言われた</li>
				<li>etc.</li>
				</ol>
				
				<p>様々なケースで必要になってきます。(大半の人にとっては1のケースでしょうが)<br />
				どうやって調べればいいでしょうか。</p>
				
				<h2>:AllMaps</h2>
				
				<p><code>:AllMaps</code>を使います。<br />
				次のコードを.vimrcに貼り付けましょう。</p>
				
				<pre><code>command!
\   -nargs=* -complete=mapping
\   AllMaps
\   map &lt;args&gt; | map! &lt;args&gt; | lmap &lt;args&gt;
</code></pre>
				
				<p>kana氏の.vimrcに定義されていた<code>:Allmap</code>にインスパイアされたのでそちらも興味があれば参照してください。</p>
				
				<ul>
				<li><a href="https://github.com/kana/config">kana/config &#8211; Github</a></li>
				<li><a href="https://github.com/kana/config/blob/master/vim/personal/dot.vimrc">kana氏の.vimrc</a></li>
				</ul>
				
				<h2>使い方</h2>
				
				<pre><code>" 全てのマッピングを表示
:AllMaps
" 冒頭で言った1のケースのように現在のバッファで定義されたマッピングのみ表示
:AllMaps &lt;buffer&gt;
" どのスクリプトで定義されたかの情報も含め表示
:verbose AllMaps &lt;buffer&gt;
</code></pre>
				
				<p>短くシンプルながらも他のExコマンドと組み合わせることで効果を無限大に発揮できるExコマンドです。</p>
				
				<h2>:Capture</h2>
				
				<p>また作者が作った<code>:Capture</code>というExコマンドがあります。<br />
				引数に指定したExコマンドを実行し、<br />
				コマンドラインへの出力をバッファに表示するというものです。<br />
				出力から検索したい場合などに便利です。<br />
				(<a href="http://d.hatena.ne.jp/tyru/20100427/vim_capture_command">筆者のブログの記事</a>も参照してください)</p>
				
				<pre><code>command!
\   -nargs=+ -complete=command
\   Capture
\   call s:cmd_capture(&lt;q-args&gt;)

function! s:cmd_capture(q_args) "{{{
    redir =&gt; output
    silent execute a:q_args
    redir END
    let output = substitute(output, '^\n\+', '', '')

    belowright new

    silent file `=printf('[Capture: %s]', a:q_args)`
    setlocal buftype=nofile bufhidden=unload noswapfile nobuflisted
    call setline(1, split(output, '\n'))
endfunction "}}}
</code></pre>
				
				<p>このExコマンドを使えば次のようにしてバッファに出力を書き込むことができます。</p>
				
				<pre><code>" 全てのマッピングをバッファに書き込む (/コマンドで検索できる)
:Capture AllMaps &lt;buffer&gt;
</code></pre>
				
				<h2>もう少し:Captureについて (vimshell)</h2>
				
				<p>vimshellではコマンドラインでの入力で先頭に<code>:</code>をつけるとVimスクリプトのExコマンドだと解釈してくれます。<br />
				これは<code>vexe</code>という内部コマンドを使っているので興味があればそちらも参照してください。<br />
				(以下<code>$</code>がvimshellのプロンプトだとします)</p>
				
				<pre><code>$ cd    # ホームディレクトリに移動
$ ls    # /bin/lsを実行 (実際にはlsは内部コマンドで、それが/bin/lsを呼び出しているようです)
bin git
$ :ls   # :lsを実行。バッファリストを表示
1  a   "~/memo/todo.txt"      line 0
3  a   "~/.vimrc"             line 0
</code></pre>
				
				<p>とても便利でクールですね。</p>
				
				<h2>もう少し:Captureについて (unite.vim)</h2>
				
				<p>unite.vimのunite-outputというsource(<code>:help unite-sources</code>)を使えば<br />
				Vimスクリプトの出力をuniteバッファに取り込み、絞り込むことができます。<br />
				詳しくは<code>:help unite-source-output</code>を参照してください。</p>
				
				<address class="hack-author">tyru</address>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2011/02/hack203/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>USSR#1: neocomplcache ソースコード読解会</title>
		<link>http://vim-users.jp/2009/12/ussr1/</link>
		<comments>http://vim-users.jp/2009/12/ussr1/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 07:36:02 +0000</pubDate>
		<dc:creator>Shougo</dc:creator>
				<category><![CDATA[イベント]]></category>
		<category><![CDATA[neocomplcache]]></category>
		<category><![CDATA[Vim script]]></category>

		<guid isPermaLink="false">http://vim-users.jp/?p=1220</guid>
		<description><![CDATA[文責: ujihisa, Shougo, sorah 今日は neocomplcache-4.0.3/autoload/neocomplcache.vim を読みました。 勉強会チャットログはこちら: http://li [...]]]></description>
			<content:encoded><![CDATA[				<p>文責: <a href="http://ujihisa.blogspot.com/">ujihisa</a>, <a href="http://vinarian.blogspot.com/">Shougo</a>, <a href="http://codnote.net/">sorah</a></p>
				
				<p>今日は <code>neocomplcache-4.0.3/autoload/neocomplcache.vim</code> を読みました。</p>
				
				<p>勉強会チャットログはこちら: <a href="http://lingr.com/room/vim/archives/2009/12/22">http://lingr.com/room/vim/archives/2009/12/22</a></p>
				
				<p>特にしっかりと読んだ関数:</p>
				
				<ul>
				<li><code>function! neocomplcache#enable()</code></li>
				<li><code>function! s:complete()</code></li>
				<li><code>function! s:integrate_completion(complete_result)</code></li>
				</ul>
				
				<p>APIとなる<code>neocomplcache#</code>ではじまる関数群が<code>autoload/neocomplcache.vim</code>の上部にまとめて定義されています。
				また、内部で使う関数群が続いて下部にスクリプトローカルで定義されています。</p>
				
				<p>興味深い部分の抜粋:</p>
				
				<pre><code>echo ''
redraw
</code></pre>
				
				<p><code>redraw!</code>だと画面がちらつくので、そういうときはこの二行で、ということだそうです。</p>
				
				<h2>まとめ</h2>
				
				<p>&#8220;neocomplcacheのソースコードは<em>魔界</em>&#8220;</p>
				
				<p>コード自体はすばらしく整理されているものの、
				Vim自体とその周囲の問題を解決するために涙が止まらない努力が随所に見られます。</p>
				
				<ul>
				<li>ATOK</li>
				<li>画面のチラツキ</li>
				<li>速度 (skip)</li>
				<li>プラグイン</li>
				<li>補完の統合</li>
				<li>頻度解析</li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2009/12/ussr1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vimpressのご紹介</title>
		<link>http://vim-users.jp/2008/10/vimpress%e3%81%ae%e3%81%94%e7%b4%b9%e4%bb%8b/</link>
		<comments>http://vim-users.jp/2008/10/vimpress%e3%81%ae%e3%81%94%e7%b4%b9%e4%bb%8b/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 13:12:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Vim script]]></category>

		<guid isPermaLink="false">http://vim-users.jp/2008/10/vimpress%e3%81%ae%e3%83%86%e3%82%b9%e3%83%88/</guid>
		<description><![CDATA[Vim-users.jpはWordPressを用いているのですが、このWordPressに投稿するvim scriptがありましたのでご紹介します。 Vimpress &#8211; Manage wordpress b [...]]]></description>
			<content:encoded><![CDATA[				<p>Vim-users.jpはWordPressを用いているのですが、このWordPressに投稿するvim scriptがありましたのでご紹介します。</p>
				
				<p><a href="http://www.vim.org/scripts/script.php?script_id=1953" title="Vimpress - Manage wordpress blog posts from Vim : vim online">Vimpress &#8211; Manage wordpress blog posts from Vim : vim online</a></p>
				
				<h3>インストール</h3>
				
				<p>vimpress.tar.gz を取得して展開したものを.vimディレクトリに保存してください。</p>
				
				<p>また、このvim scriptはPythonを使用して書かれており、標準添付でないxmlrpclibというライブラリを使用しています。別途インストールを行ってください。</p>
				
				<h3>使用方法</h3>
				
				<p>.vim/plugin/blog.vimを開き、Settingsセクション内に以下の内容を入力して保存します。</p>
				
				<ul>
				<li>blog_username: ユーザーID</li>
				<li>blog_password: ユーザーパスワード</li>
				<li>blog_url: http://vim-users.jp/xmlrpc.php</li>
				</ul>
				
				<p>コマンドは以下になります。</p>
				
				<ul>
				<li>新規作成: :BlogNew</li>
				<li>エントリ一覧: :BlogList</li>
				<li>エントリ編集: :BlogOpen id</li>
				<li>エントリ投稿: :BlogSend</li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://vim-users.jp/2008/10/vimpress%e3%81%ae%e3%81%94%e7%b4%b9%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

