2013/12/12

つくったVim PluginとつかったVim scriptのはなし

この記事は Vim Advent Calendar 2013 の 12日目の記事です。

もう12月も半ばですね。
みなさまは年の暮れに向けていかがお過ごしでしょうか。
私の場合、Plugin作りがなかなか進まず、苦しい年末が近づいております。

さて、今回は自分で作ったPlugin4つの紹介とその時に知ったVim scriptについてのことを書こうと思います。

まずは一つ目です。
Vim scriptをVim Pluginとするにはディレクトリを分けるなど Vim Pluginとしてのルールがあります。
ですが、「あっ、これPluginにしよう!」と思った時にmkdirやtouchコマンドを連打するのは面倒です。
:help write-plugin にもある通り、Pluginとするにはディレクトリを分ける必要があります。
直ぐにパッと作って行きたい、Pluginを作りはじめるまでをカイゼンしようというわけです。

そんなときに使うために作ったのがこれです。
mopp/layoutplugin.vim
Vimからディレクトリ、スクリプトファイル、README.mdをパッと作ってくれます。
スクリプトファイルの中身もテンプレ的に出力してくれます。


2つ目です。
githubをふらふらしていた時にたまたま見つけた、
数年前にmattnさんが作ったgooglesuggest-complete-vimをneocomplete.vim向けにラップしました。
mopp/googlesuggest-source.vim
自動でgoogle補完力で入力ができます。
個人的に5分で出来たにもかかわらずなかなか面白いなあと感じております。
ただ少々不安定なのは通信をするからでしょうか…
そういうときはインサートモードで<C-U>するとよいです。


3つ目です。
molokaiのような色合いが好みなのですが
コメントの色など不満が幾つかあったのでmolokaiを元に自分のカラースキームを作りました。

mopp/mopkai.vim
もぷかいと読んでやってください。
molokaiよりも強めのカラーリングのつもりです。
自分のためのカラースキームなのでこれからもガンガンいじっていく予定です。

4つ目です。
先日のvimrc読書会で誰かこれをPlugin化という話が挙がっていたのでささっとしておきました。
mopp/autodirmake.vim
:e new_dir/text.txt と編集した際にnew_dirが存在しないディレクトリだとVimはファイルを保存できません。
このPluginを入れておけば、保存時にディレクトリを作成してくれます。


次にPluginを作ってる時に知ったVim scriptについてです。
自分がメモとして書き留めていたものを、色がついて見やすいのでgistにまとめました。
詳しくは:helpで見たほうがよいでしょう。

波括弧付き変数とかすごいですね
Pluginをどんどん生み出している人からすれば当たり前かもしれませんが
私は、helpを読破していないのでVimの知らない機能がまだあります。
人のPluginを読むとなんだこのコマンドは…というのもよくあることです。

Vim Plugin力もレベルアップしていかねばなりませんね。

というところで、今回は筆を置くことにします。

Happy Vimming !

2013/12/06

OSの超簡単なメモリ管理を実装するおはなし

この記事は Aizu Advent Calendar 2013 6日目の記事です。
前日は「Aizu Advent Calender 5日目(ダイエット成功したかも知れません)」でした。

おはようございます。
もぷりです。
最近すっかり寒いですが、皆様いかがお過ごしでしょうか。
私は今、胸部に痛みを感じつつキーを叩いております。

さてさて、今年もAdventな季節がやってまいりました。

今回は自分の作ってるOSでとりあえず実装した簡単なメモリ管理について書きます。
間違いなどの指摘があれば@Mopp_jpでもissuesでもなんでもよいのでぜひ言ってください。

リポジトリはこれです。

まず、メモリの管理とは
「OS内でハードウェアからのメモリ情報を使って
動的なメモリ確保を行えるようにする。」
ということです。

もっと簡単に言うと使っているのか使っていないのかを自動で判断してメモリ割り当てをしてくれるって意味です。


順を追って説明をします。

まず、OSはブートローダというOSを起動するだけ+αのソフトウェアから起動されます。
具体的にはgrubとかLILOですね。
で、このブートローダはBIOSが起動します。

BIOS → ブートローダ → OS → ζ*'ヮ')ζ<うっうー

このように起動していきます。
ちなみに、もぷりんOSでは色々とめんどかったのでgrubから起動されること前提で作っています。

先に言ったように、ブートローダはOSを起動するだけ+αです。
ですが、とても大切ですので簡単に説明します。

OSの実行ファイルをデバイスから探す
OSの実行ファイルをメモリに読み込む
ハードウェア情報、BIOSコールの戻り値などをメモリに置いておく
読み込んだOSの実行ファイル先頭部分へジャンプ

この4ステップです。
シンプルですねー(※1ステップ目以外)

このOSが起動した時点で、メモリについて考えてみます。
はい、なにもないですね。
ですので、とりあえずOSはセグメントというものを設定します。
セグメントもメモリに関係するものでメモリの使用用途や権限を定めるものです。
(※セグメントも大事なことなのですが今回は説明しないですすいませんです。)

他にも割り込みなどいろいろと設定するものがあります。
どれもこれもコンピュータ上のデータであるからにはメモリ上に存在していなければなりません。
しかし、まだ、動的メモリ確保は行えませんので以下のようにします。


メモリを直書きしてキャストです。
変数をグローバルにおいても別にいいのですが、配列などの大きなデータを入れてしまうのはサイズ的に気が引けます。
出来れば、ポインタだけで済ませたいです。
場合によってサイズが変化する場合などなおさら動的に確保して無駄を減らしたいです。

そもそも、こういうことをたくさんやるのは良くないですし
いちいちアドレスを気にするのも面倒です。

そこで、やっと本題のメモリ管理です。
メモリ管理の初期化は2ステップです。
メモリ情報取得
それを元にメモリ空間をリスト構造化

使うときには普通のC言語と同様にmallocとfreeで扱えます。

1ステップ目
BIOSコールを使って、コンピュータのメモリ情報を取得します。
grubであれば取得データを渡してくれます。
この情報にはメモリの領域が使えるか使えないかという部分が入っています。

使えない部分というのはブートローダに処理が渡った際、既にデータが置いてあって、書き込みされると困る部分です。
そこには割り込みベクタなどがあります。

これは特に問題ないですね。

2ステップ目
メモリ管理には有名なものでビットマップを用いるものと連結リストを用いるものがあるようです。
簡単に説明をします。

ビットマップ方式
    固定長(4KBくらい)でメモリを区切って、その一つを1bitに割り当てて、使っている、使っていないを判断します。
リスト方式
    可変長でメモリを区切って、ここからここまで使ってる、ここからここまで使っていない、という風に判断します。

後々便利そうだったのでもぷりんOSでは連結リストを使用しました。
ファイルはこいつです。
https://github.com/mopp/Axel/blob/advent/src/doubly_linked_list.c

さて、コードをさらーっと見ていきます。

ここでOS起動時の初期化で呼ばれる関数はinit_memory()です。
引数にはgrubのくれるメモリ情報、とそのサイズが渡されます。

L57init_memory_list()で、メモリ管理に使用するデータとリストのノードを初期化します。
> dlst_nodes = (struct dlinked_list_node*)(get_kernel_end_addr() + sizeof(Memory_manager));
> mem_info = (Memory_info*)(dlst_nodes + sizeof(struct dlinked_list_node) * MAX_MEM_NODE_NUM);

> mem_manager = (Memory_manager*)get_kernel_end_addr();
これはカーネル(OS)の読み込まれた末尾のメモリを使用するためにアドレスの計算をしています。
get_kernel_*関数の中身を見ればわかりますが、メモリ直書きと大差ないです。

次にL60-L80でメモリ情報を元にリスト構造化します。
set_meminfo()関数を使って、ベースアドレスとそこからの長さをリストのデータに持たせます。

その後にL82-L117でカーネル部分のメモリを使用中にしておきます。
ここを忘れては元も個もありません(TODOは見なかったことにしてください)

初期化はこれだけです。

あとは使うだけですのでmallocとfreeを用意します。


mallocでは受け取ったサイズが入る領域を持つノードを探して行って、見つかったらその先頭部分から新たにノードを作り、使用中にします。
これをfirst-fit方式といいます。
手っ取り早くていいですね。

freeは確保時に返したアドレスを探していき、見つかったら空き領域とし
可能ならば前後のノードとまとめる、ということを行います。


はい、以上です。
OSのメモリ管理なんてもっと難しいのかと思っていたら案外そんなことはありません。
わかりにくかったらそれはきっとこの記事が悪いのでしょう。

といっても、はりぼてにすらならない穴だらけOSなのできちんと作っていきたいです。

明日、Aizu Advent Calendar 2013、7日目はmotiさんです。

2013/11/17

VimConf2013 に行ってきた話

11/16にクックパッドにて行われたVimConf2013に参加してきました。
疲労感高まる帰りの新幹線内ですが、つらつらと感想を書いてみます。

まず、暗黒美夢王やthincaさん(ニャル子さんクリアファイルもらった!!)、ujihisaさん、ももんが(すごい)さん、derisさんをはじめとする、
ちったーやlingrでお世話になっている方々とお話させていただいたので、とても感極まりました。

また、プレゼン発表では香り屋さんの「How to suggest new features for Vim」がとてもお上手でなるほどなあと感じることが出来ました。
相手を十分に説得するに足る理由を持つこと、Bram氏へのパッチに限った話ではないので参考になります。
他の方々からももちろん、Vimへの想いを感じました。

懇親会では、うわさに聞いていた暗黒美夢王の歌も聞くことが出来ましたし、
ああ、やっぱりこの人は変態(へんしゅう)だなと再認しました。

自分も早く登壇者側にまわりたいものです。
Pluginも大量に作らなくてはいけませんですし…

今回参加できなかった人はまた次回のVimConfが行われるはずですので
ぜひ参加しましょう。

最後に一言。

まったく、Vimは最高だぜ!!

2013/08/29

「実践Vim」レビュー

先日、kaoriyaさんから抽選で実践Vimを頂けるという企画に応募したところ
抽選して、一足先に実践Vimを手に入れました!
http://www.kaoriya.net/blog/2013/08/24/

その条件としてレビューを書くことになっていますので、読んでみた感想を簡単に書いていきます。
慣れていないので拙いところはご勘弁下さい。

さて、きっとこの記事を読んでいるあなたはもう既にVimがなんなのか程度は知っていることでしょう。

結論から言います。

買いましょう。

とても良い本だと思います。
TIP集となっていて、目次からばーっと見て探しやすく、Vimの操作はコマンドとカーソルの動きが表形式で表されており見やすいですし、その表のおかげで試し易いです。
背面に[初級技術者向け]と書いてありますが、ある程度「Vimゥ…Vimゥ…」と言い始めた人なら手元に置いて損はしない本です。

正直に言って、私は「まあ、初心者Vimmerでは無いだろ、Vim力も575あるし」と思っていました。

ですが、読み始めて、初心者用の解説部分にさり気ないところへ手がとどくコマンドも併記していて「アッ」となることが多々ありました。
例えばビジュアルモード時のoコマンドがそうです。これは選択範囲の終点と始点をトグルしてくれます。
恥ずかしながらこれを読むまで知りませんでした。

本書は、全体的に如何にエディットするか?といったことに重点をおいているようです。
だからでしょうか、最初に「ドットの公式」といってドットコマンドについて述べています。
「Vimってこんな機能でこんなことができるんですよー」というスタイルではなく、
「Vimmerっていうのはな、こういう時はこうするのがクールなんだぜ」という印象です。
まさに、実践的なVimの書というわけです。

個人的には第3部第8章「モーションによるファイル内の移動」がお気に入りです。
w,b,e,ge などの基本から自動マークまで書いてあります。
特に「Vimの強力な移動手段は致死レベルの正確性で目標に到達する」というテキストオブジェクト部分が面白いです(ニンジャの絵もありますからね)。
約7ページですがテキストオブジェクトについてきちんとわかりやすく、図が付いて、説明されています。

また、Vim本体について のみだと思って 読んでいたら、コラム的にPluginの紹介もいくつか挟んでありました。
ある機能について解説をした後に更に便利にしたいならこのPluginがオススメ、と言った感じでKanaさんやTim PopeさんのPluginが簡単な使い方とともに紹介されています。
しかも、一度使い始めたらやめられない中毒性の高いpluginばかりです。

以上のこと以外にも基本機能のかなり細かい解説がされていて、すんなりと読んで行けます。
初級中級者の方は一読するだけどもワンランク上のVimmerに近づけること間違いなしでしょう。

ぜひ、お近くの書店へ駆け込んで下さい。

2013/08/20

vim-airline に乗り換える5つの理由

この記事は Vim Advent Calendar 2012 の 263 日目の記事です。

今回はつい先日
かなり素晴らしいPluginがリリースされて、大分人気になっているようでしたので紹介します。


vim-airlineってなに?

https://github.com/bling/vim-airline より引用

https://github.com/bling/vim-airline/wiki/Screenshots よりいくつか引用
dark theme with powerline symbols
light theme
solarized light
上の画像を見ればお分かりでしょう。
Vimのステータスラインをかっこ良くしてくれるPluginです。

以前までは、ステータスラインのカスタマイズといえばset statuslineをいじる、powerline(新版), vim-powerline(旧版) くらいの選択肢でした。

airlineはここに新たな選択肢を加えてくれました。


1. Vim script のみで実装

    新しいバージョンのpowerlineではvim以外のzshなどに適用させるためかpythonが必須となり、重くなってしまいました。
対して、airlineは高速です。
※powerlineがpythonを使う利点はしっかりとあります。


2. 他のpluginに対応
    現在、airlineは bufferlinefugitiveunitectrlpminibufexpl,gundo,undotreenerdtreetagbarsyntastic,lawrencium の Pluginに対応しています。
これらがstatuslineに表示する情報を上書きしません。
また、ここで自分のpluginに対応させたいときも簡単に設定出来るようです。
詳細は:help airline-funcrefs を参照下さい。

2013/08/21 追記
例えばuniteやvimfilerでairlineを優先するときは.vimrcに以下を追記します
let g:unite_force_overwrite_statusline = 0
let g:vimfiler_force_overwrite_statusline = 0
上記以外にも着々と対応pluginが増えているようでとてもよいですね


3. 他のカラースキームに合わせたテーマ
    有名なカラースキームに合わせたテーマを幾つか持っています。
上記の画像にもsolarizedを載せました、solarizedなVimによく合うのではないでしょうか。 
他にもmolokai, jellybeansも含まれます。また、独自のテーマも含むと14種類あります。


4. 手軽なstatusline
    この部分をこういう表示に変えたいなーという時があるはずです。
airlineでは statuslineはいくつかのセクションに分かれており、g:airline_section_HOGE といういくつかの変数で、めんどくさいstatuslineの設定をてっとり早く行います。
また、セクションに分かれているので、ここだけ変えたい!というときも簡単です。
詳しくは:help airline-customization へ


5. 引き継げるフォント
    今までpowerlineを使っていたVimmerも多いはずです。
しかし、せっかくpowerlineのパッチを当てたフォントがあります。しかも、かっこいいです。
airline ならそのまま使い続けることができます。もちろん、変更も簡単です。
:help airline-customization



では、今すぐairlineをインストールしましょう。
NeoBundle 'bling/vim-airline'

2013/07/10

あなたの Vim は もっと Smart に Input できる

この記事は Vim Advent Calendar 2012 の 222 日目の記事です。

みなさま、こんにちは
もぷりです。

私の住む地域では、まだまだ梅雨が続いているにもかかわらず
連日が30度超とふざけてるのか?と思うくらいにジメジメと暑いです。
「這いよれ!ニャル子さんW」も無事放送終了し、少し残念な気持ちに浸っているところになんて天気でしょうかね。

さてさて、本日の内容は
Kanaさんこと、偉大なるVim神(グレートヴィムゴッド)によって作成された
この2つのPluginについてです。
数多のVim Pluginの中でもかなり強力なPluginだと思います。

単体でも十二分に有用ですが、それぞれの出来る事がきちんと分かれています。
それら2つを良い感じに組み合わせて使用する方法を紹介します。

組み合わせることで以下が出来るようになります。

  • SmartChrに条件を追加出来る
  • SmartInputに繰り返させる


早速、コード例は以下です。

NeoBundleLazy 'kana/vim-smartchr',  { 'autoload' : {'insert' : '1'} }
NeoBundleLazy 'kana/vim-smartinput', { 'autoload' : {'insert' : '1'} }

" Smartinput
let s:bundle = neobundle#get('vim-smartinput')
function! s:bundle.hooks.on_source(bundle)
    " ***ここから!***
    call smartinput#map_to_trigger('i', '%', '%', '%')
    call smartinput#define_rule({
                \ 'at'    : '\%([^''"][\sA-Za-z]\*\|^\|%\)\%#',
                \ 'char'  : '%',
                \ 'input' : "<C-R>=smartchr#one_of(' % ', '%')<CR>",
                \ })
   " ***ここまで!***
   " ~~略~~
endfunction
unlet s:bundle

" Smartchr
let s:bundle = neobundle#get('vim-smartchr')
function! s:bundle.hooks.on_source(bundle)
" ~~略~~
endfunction
unlet s:bundle


%を入力した時、カーソルより前に'か"があれば、SmartInputしないという設定(のつもり)です。
正規表現がうまくかけないものでして…
これによって、Cのprintfのフォーマット文字列ないでSmartInputされてしまうということを回避出来るようになります。

このSmartInputの設定ではExpressionレジスタ(:help @= 参照)を使って
SmartInputからSmartChrのマップ先を呼び出しているのがポイントです。

これを使えば自分で設定した関数なども呼び出せるので応用の幅が広がると思います。

下記参照でも使われていますが、<C-O>を使っても、インサートモードからコマンドを実行出来ます。
こちらを使って標準関数を読んだりなどもとても便利です。

詳しくは、:help smartinput と :help smartchr
もしくは@Linda_ppさんの記事がとても素晴らしいのでそちらを参考にしてほしいです。
また、githubに私のvimrcをあげていますのでそちらの設定が役に立てば幸いです。


その他補足説明:
先頭2行はNeoBundleの設定です。Lazyで遅延読み込みをしています。
非常にオススメなので、ちょいとそちらの説明をしましょう。

この設定だと、起動後に初めてインサートモードへ入った時、pluginが読み込まれます。
SmartInputとSmartChrは基本的にはインサートモードのマッピングを設定してくれるpluginです。
したがって、上記で問題ないかと思います。(ただし、コマンドラインモードでも使う人は設定を変えたほうがいいかも)

5から15行目にかけて、SmartInputの設定が記述してあります。
ここでは、neobundleのhook機能を使っています。
これによって、「pluginの読み込み時に実行する処理」(on_source時にhook)が書けるようになります。

2013/08/19追記
友人が組み合わせを発展させてくれたのでGistに貼っておきます。
以下ですとシングルクォートやダブルクォートないで+-=%などの補完を行いません。
また、四則演算子のあとで=を打つといい感じにしてくれます。

2013/03/24

ターミナルからvim-refでmanが見たい

vim-refというthincaさんの作ったPluginがあります。

各種言語のリファレンスを見ることが出来るプラグインでpydocやmanをVimから見たり、Wikipediaを検索したり、Weblioを引いたりできます。

今日、ふと
ターミナルからmanで調べていたのですがVimでみたいなー
と思いました。

毎回、

$ Vim
:Ref man hoge

と打つのは少々めんどっちいのです。

なので.zshrcに以下の関数を追加しました。

function vimman() {
    vim -c 'Ref man '$1 -c 'winc j' -c 'q'
}

これでターミナルから

$vimman hoge

で見れます。

ちょっとだけ便利ですね(。・ω・。)

2013/03/14

カーソルキーさん@つかわない インサートモード編

この記事はVim Advent Calendar 2012  104日目の記事になります。
103日目は@ujihisaさんのunite-buildでした。


Vimッ!  使わずにはいられないッ!

カーソルキーでエディット?

貧弱貧弱ゥ!!



はい、すいません。

というわけで
以前、書いた記事にも似たようなことをチラッと書きましたが、改めてきちんと書きなおしてみます。

Vimmerであればノーマルモードにおいて、息をするよりも簡単にhjkl移動をすることだと思います

しかし、インサートモードではどうでしょう?
案外カーソルキーに手を伸ばしがちですね。
私もVimを使い始めたばかりの頃はそうでした。

そもそも、インサートモードにおいてカーソルキーを連打ってしまうくらいの移動ならば
<ESC>してノーマルモードで移動すべきだと思います。
Vimは音ゲーでは無いので連打なんてするべきではないのです。

標準では以下のように与えられています。

下の行へ
<C-G><C-J>
<C-G>j
上の行へ
<C-G><C-K>
<C-G>k

これでは物足りませんね(゜.゜)

そこで、この上記に加えるといいであろう設定を列挙します。

<C-A> - 行頭
<C-E> - 行末
<C-F> -  右
<C-B> -  左

noremap! <C-A> <Home>

noremap! <C-E> <End>

noremap! <C-F> <Right>

noremap! <C-B> <Left>

noremap! <C-D> <Del>

emacsライクに設定しています
私がこの設定にしている理由はMacを常用しているからです。

Macだと結構な割合でemacs移動バインドがテキストボックス内で使えるので案外役に立つのではないでしょうか。
あと、emacsも最低限の動作は覚えておきませんと。

emacsっぽいとかイヤっていう人は
私は使っていませんが,こちらの設定をおすすめします

<C-K> - 上
<C-J> - 下
<C-H> - 右
<C-L> - 左

これならコントロールキーを押すだけなので(マップ程度で考える必要はないでしょうが)学習コストは無に等しいですね


さて、普通のVimmerならカーソルキーを設定したら
ReturnとかBackSpaceも遠いんじゃないかと思い始めるものです

というか<ESC>も遠いですよね?

<ESC>キーには標準で<C-[>が割り振られています。
これを使うといいはずです。

余談ですが、入力中のコマンド表示を設定するshowcmdオプションを有効にしておくと
私の環境では<ESC>を押すと右下には^[が表示されるのでもしかすると<ESC>が^[のマップなのかなあ、なんて思ったりしてます。
言っておいてアレですが、私は未だに<ESC>から移行できていません・・・(○ω○`)

Returnキーもまた標準で<C-M><C-J>に割り当てられています。
Emacsは<C-M>が標準のようだったので<C-M>を使うようにしてます。

こんな感じで挿入モードもどんどんカスタマイズして行きましょう

2013/02/18

Vim から zsh を呼ぶ プラギン 紹介

Advent Carender ぶっちぎってしまいましたねすいません(´・ω:;.:...

この記事はVim Advent Calendar 2012 : ATND 80日目の記事になります。
79日目は @rbtnnさんの「Vimの正規表現`\%`は結構便利だよ」という話



ProVimmerの方々はVimShellをお使いのことと思いますが
既存のshellと同様に使うには最初に幾分かの設定が必要だったりします。
shellスクリプトも異なっているようですし。

自分も一時期使っていましたが、なかなか慣れずに
Console Vim派でもあるので<C-Z>か:shell、普通に一旦閉じるに戻ってしまいました。

しかし、先日
なかなか良さげなプラギンを見つけたので紹介します。

Conqueというターミナルのインターフェースのような感じのものです。
shell以外にもターミナル上のもの(例えばemacsなど呼び出せます)
zshもzshrc, zshenvの設定のままで使えます。


((((;゚Д゚))))


とりあえず設定を以下に


NeoBundleLazy 'http://conque.googlecode.com/svn/trunk/', { 'autoload' : { 'commands'  : ['ConqueTerm', 'ConqueTermSplit', 'ConqueTermTab', 'ConqueTermVSplit'] } }

" Conque
let g:ConqueTerm_ReadUnfocused = 1
let g:ConqueTerm_CloseOnEnd = 1
let g:ConqueTerm_StartMessages = 0
let g:ConqueTerm_CWInsert = 1
noremap <silent> <Leader>sh :ConqueTermVSplit zsh<CR>

" Conque
function! s:delete_ConqueTerm(buffer_name)
    let term_obj = conque_term#get_instance(a:buffer_name)
    call term_obj.close()
endfunction
autocmd BufWinLeave zsh\s-\s? call <SID>delete_ConqueTerm(expand('%'))

NeoBundleLazyは別にNeobundleでも構わないですが、起動高速化のためにLazyにしてあります。


:ConqueTermVSplit hogehoge

で、ターミナル上で動作するプログラムをVim上で操作出来るようになります。
※ただし、インサートモードのみ


さて、このプラギンの欠点は、例えば、zshを起動し、そのバッファを閉じた場合
zshプロセスが残ってしまうということです。

そこでもう一度、zshを起動すると別プロセスで立ち上がります。
Vimを終了するまでは消えないようです。
iTerm2などから確認出来ます。

まあ、終了すればいいのですが、やっぱりVimに引きこもりたいです。

そこで、対策としてでしょうかConque自体がいくつかのAPIを提供していますので
上記のように、autocmdを使って、zshバッファのとき、バッファ名からConqueの生成したプロセスを終了できます。

これで、プロセスが何重にもなることを防げます。


こうして、どんどんVimに魔改造が施されていくわけですね

2013/02/20追記
https://twitter.com/tyru/status/304203604795994112
tryuさんより以上のご指摘を受けました。
ここを参照

うーん、でも動いてる感じが…
修正できたらまた追記します

2013/02/03

VimのイカしたPowerLineが新しくなってた

はい、なってましたね
VimだけじゃなくてShellまでかっこよく出来るようになるとかなんとか

しかし、思ったより手間だったのでメモ


以下はMacです
加えてFontへのパッチはうまく出来ませんでした
fontforgeのためにhomebrewに変えるのがめんどうで…

環境は以下
Mac OS X Lion
Python27(Mac標準のAppleのやつ)
iTerm2
MacPorts

基本的にここに書いてあるとおりにすれば問題は無いはずです。

Python版のVimについては
MacPortsもしくはHomeBrew、自分でビルドのどれかで入れます。
いつもどおりビルドしました。


以下の手順はドキュメントのコピペです。

portで使うpythonをappleのものに変更
もしかすると上の3つも変更後にやったほうがいいかもです

Pythonを使うのでpipなるパッケージマネージャを入れて、PowerLineのインストール
上の3つはオプションでらしいですが入れておきます。

sudo port select python python27-apple
pip install --user pygit2
pip install --user mercurial
pip install --user psutil

pip install --user git+git://github.com/Lokaltog/powerline

ここでも、よくわからないのですがMacPortsでインストールしたgcc48とかだと
pipのinstall時にコンパイラオプションかなんかのエラーでできませんので
Mac標準のgcc42の方でやるとインストール出来ます。

pygit2はヘッダファイルあたりの関係でインストールできなかったのでしてません
一応動いたし多分大丈夫…

次に以下を.vimrcへ書き込みます

" NeoBundle 'git://github.com/Lokaltog/powerline.git'
python from powerline.bindings.vim import source_plugin; source_plugin()
source ~/.vim/bundle/powerline/powerline/bindings/vim/plugin/source_plugin.vim

初めは下の2行をコメントアウトして、
NeoBundleでgitからPowerLineを持ってきます。

持ってきたらNeoBundleで読み込まれると困るのでコメントアウト
下の2行をコメントアウト解除

ここでiTerm2を使っている場合は注意が要ります。
バージョンが低いとbugのせいで表示できません
こちらの中で新しいのを入れておけば問題ないはずです。

さて、Fontの準備ができていればこれでもう動くはずです。

できていない場合はドキュメントの通りにパッチを当てて下さい
私はできなかったので公式のfontをダウンロードしてきて
iTerm2の設定でRictyと組み合わせて使ってます。

2013/01/04

痒いとこに手が届く(気がする) Vim Plugin 作った

vimrcで書いていた関数が大きくなったのでPlugin化しました

もぷり's 孫の手
https://github.com/mopp/backscratcher

vim的には良くないのかもしれませんが
なんか、便利そうなVim Scriptを書いたら追記して行こうと思います

お陰でvimrcがかなりすっきりしました。