アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Mac OS X おすすめキーバインド

こんにちは。MacBookAirで仕事している坂本です。

自分はショートカットキーが大好きです。
ただアプリによってはショートカットキーが動かずイライラすることがあります。
今回はそんなようなことがないようにアプリを使ったオススメのキーバインドを紹介しようと思います。。

まずキー割り当てを変更するアプリにはKeyRemap4MacBookを使用します。


KeyRemap4MacBook


https://pqrs.org/macosx/keyremap4macbook/

こちらからお使いのOSXバージョンに合ったインストーラーをダウンロードしてインストールしてください。
LaunchpadまたはアプリケーションディレクトリにKeyRemap4MacBookというアプリが出てくるのでダブルクリックで起動させましょう。

するとChange Keyというタブで利用できるキーバインドの一覧が表示されます。
この中から使いたいキーバインドにチェックすれば良いというわけです。


ホームポジションのままフロントスペースを!!


まずはフロントスペースです。
フロントスペースはバックスペースが前の文字を消すことに対して後ろの文字を消すためのキーです。
WindowsではBSキーがBackSpaceでDeleteキーがフロントスペースですね。

Macのデフォルトでもcontrol+Dでカーソルの後ろの文字を削除することができますが一部の対応していないMicrosoft Wordなどで動きません。
そこでFn+deleteではなくcontrol+deleteにキーを割り当てることでタイムロスを防ぐことにします。



▼ Change Delete Key
  □ Control + Delete to Forward Delete


になります。
これで文字を削除する時は右手の小指は迷わずにdeleteへ向かうことができ前の文字を消すか次の文字を消すかはcontrolキーでコントロールできるわけです。

非常に便利です。


ホームポジションのままカーソル移動!!


次にカーソルキーです。

カーソルを動かすため頻繁に使うキーなのですがどうやっても右手がホームポジションから離れてしまいます。
ホームポジションへ右手を戻す時に人差し指でJキーの凹凸を探す手間が増えます。
そこでcontrolキーと合わせてカーソルを移動させるキーバインドを設定しましょう。

私はサーバでファイルを編集する時はViコマンドを使っているのでViの設定をキーバインドに持ち込みます。

KeyRemap4MacBookキーバインド一覧に



▼ Vi Mode
  □ Control_L + hjkl to Left/Down/Up/Right


にチェックを入れましょう。
するとViの操作と一緒にhキーを押すと左へ、jキーを押すと下へとカーソルが動くようになります。

Emacs派の方は



▼ Emacs Mode
  □ Control + PNBF to Up/Down/Left/Right

があるのでこちらを使ってください。
最初は違和感がありますが、慣れてくるとプログラミングでもメールでも驚くほど早くなります。


キーリピート速度アップ!!


最後にキーを押しっぱなしにした時のキーリピート速度を早めたいと思います。
これもKeyRemap4MacBookで変更することができます。

Key Repeatタブ内の



▼ Basic Configurations
 ▼ Key Repeat
   Key Repeat


こちらのvalue値を小さくすることでキーリピート速度が早くなります。
おすすめは23msくらいでしょうか。

以上の3つだけですが自分はこれだけでかなり業務を効率化できています。
デメリットとしてはViを開いた時にカーソル移動でちょっと混乱する程度でしょうか。

キーバインド方法は人それぞれです。
Controlキーにバックスペースを割り当ててcapsキーにControlキーを割り当てる人もいます。

KeyRemap4MacBookを使ってどんどん使いやすい環境を整えましょう。

ありがとう、vim。

皆様初めまして。6月よりアシアルに入社させていただいた、斉藤と申します。
主にWEB開発をメインとしたエンジニアとして入社しました。

前職でWEB開発、PHPを学び、現時点でPHP歴は2年程度です。
まだまだこの世界では、ひよっこですが、何卒よろしくお願い致します。

さて、そんな中、vimというエディタを使い始めて、半年が経ちました。
この半年で、vimを使って便利だ!と感じた操作をまとめてみます。
vimを使っている方々が書かれた記事の焼き直しになるのは承知の上ですが、ご覧いただけたらと思います。


* まずモードについて


vimには複数のモードがあります。それぞれ、
ノーマルモード:閲覧、編集のための操作ができる
・挿入モード:普通のエディタのように文字入力を行うモード
・ビジュアルモード:範囲選択のこと。ノーマルモードでvを押す。
コマンドラインモード:コマンドラインによる命令が実行できるモード。正規表現を使いたい時など。ノーマルモードで:を押すと入れる。

と、モードによって出来ることが違います。
とりあえず「すべてのモード時にescキーでノーマルモード」「ノーマルモード時にiで挿入モード」というモードの切り替えを覚えると、「今何モードだっけ?」という混乱が抑えやすいのではないでしょうか。


* 便利操作1:一行操作




カット:dd
コピー:yy
ペースト:p or P


vimではノーマルモードでddと押すと、その一行がカットできます。
で、続けてyy p or Pと押すと、カットした行がペーストできます。
(コメントより、修正させていただきました)

普通のエディタだと、一行を範囲選択してCtrl+x, Ctrl+cとかですね。
vimでは同じ操作をするのに、キー入力回数が圧倒的に少ない!
ちなみにコピーのことはvimではヤンクと言うそうです。


* 便利操作2:特定のHTMLタグの中身を操作(特にこれはすごい!!!)




範囲選択:vit
削除:<strike>xit</strike> dit

(コメントより、修正させていただきました)

例:


<li><a href='xxx'>aaa</a></li>

ノーマルモードでaタグが記述されている部分(<a href...> or </a>)か、aaaというテキストまでカーソルを持っていき、vitと押すと、なんと!
aタグで囲まれた部分(aaaというテキスト)だけ選択できます!
「HTMLタグを認識して、範囲選択できる」という機能はHTML編集において、素晴らしい機能ではないでしょうか。
さらに、liタグを記述してある部分(<li> or </li>)にカーソルを合わせ、vitと押すと、今度はliタグで囲まれた部分が選択できます。

この操作の後は、yでコピーするなりxで削除するなりで、簡単に編集できます。
この機能のおかげで、HTML編集がとても楽になりました。


* 便利操作3:コマンドラインモードでlinuxコマンドを叩く




:! grep xxxx % | wc

例えば、コマンドラインモードでこんな入力を行うと、wcコマンドを利用して、現在編集中のファイルのxxxxという単語の数が分かったりします(ubuntuサーバー上のvimなど、linuxコマンドが使える環境が前提)。



:! linuxコマンドを使う宣言
% 現在編集中のファイル 

を指しているみたいです。




と、半年vimを触ってみて自分が便利に感じた機能でした。あとはctagsなどを使って入力補完などを何とかすれば、普通のエディタ以上に使えるのではないでしょうか。
使い方次第で編集、検索、状態把握などなどが簡単に出来るのは素晴らしいですね!
プラグインなども豊富にあり、自分で使いやすいようカスタマイズできるのも、嬉しいです。

このvimのおかげで自分は作業効率が格段に上がったと思っており、この新しい職場でも何とかついていけている、という実感があります。

というvimへの感謝を表したところで、今回は終わりたいと思います。

とても便利なvimのコマンド紹介

こんにちは。小川です。
今日はvimのコマンドでも紹介しようかなと思います。

僕はテキストエディタは大体vimを使っています。
執筆をしたときもvimでやっていましたし、PHPvimで書いています。

vimって色々コマンドがあって便利ですよね。友達とvimのコマンドを教えあったりして、度々「こんな便利なコマンドがあるのか!」と驚かされます。
今日はそんなvimのコマンドの中から普段使っていて便利だなーと思うものをいくつか紹介していきます。

ちなみにShiftを押しながらのコマンドは、アルファベットキーの場合は大文字で表記します。
エンターやエスケープを押下する必要がある場合はエンターやエスケープと記述します。「:」ではじまるコマンドモードはエンターを押さないと意味がないので、そこは省略します。
同時押しは+でつなげて表記し、基本的には1文字ずつ順番に押下します。


■ページ移動

「ggで」ページの先頭、「G」で末尾へ移動です。行数を指定して移動するのは「:」を押してコマンドモードに移動し、行数を入力してエンターを押します。最初は「:1」や「:124213412412」とかで先頭・末尾の移動を代用していましたが、コマンドをきちんと覚えておいたほうが楽ですね。

あとは「Ctrl+F」「Ctrl+D」「Ctrl+B」「Ctrl+U」でページを1ページ/半ページ移動はよく使います。
もう1つとっても便利なのが「zz」ですね。これを押下した行が画面の中央になるという優れものです。これも友達に教えてもらいました。


■カーソル移動

カーソル移動の基本は「h」「j」「k」「l」です。この他にも、単語単位で移動する「w」や「e」、「b」もよく使います。
行頭と行末は正規表現と同じで、「^」で行頭、「$」で末尾です。
あとは、現在のカーソル位置から特定の文字がある位置までカーソルを移動するのは「f」に続けて特定の文字を入力します。前に戻って検索するのは「F」です。
「2f<」とすると、現在のカーソル位置から2番目に登場する<の位置までカーソルを移動します。ただしこれは行をまたいで検索はできず、同じ行の中でのみとなります。
行をまたぐ場合は素直に移動するか、「/」を押してコマンドモードに移行して検索し、「n」を押して移動すればよいでしょう。

括弧の上で「%」を押すと反対の括弧に飛ぶのも覚えておくといいですよ。


■アンドゥ/リドゥ

「u」でアンドゥ、「Ctrl+r」でリドゥです。これは覚えておかないとつらいですよね。


■ビジュアルモード

ビジュアルモードは範囲選択を行う方法です。通常のテキストエディタで、マウスを用いて範囲を選択するのと似ています。
ビジュアルモードは、通常(v)、行単位(V)、矩形(Ctrl+V)と3種類あります。これは実際にやってみるのが早いですね。

例えば3行まとめて削除する場合、「3dd」と入力します。が、消したいのが何行分かぱっとわからない場合もありますよね。そんなときはまず「V」を押して行単位のビジュアルモードに移行し、カーソルを上下に移動して消したい行まで持って行きます。そうすると、選択されているっぽい感じの画面になっていると思いますので、これで「x」を押して削除します。そうすると選択されていた部分がまとめて削除できます。

ビジュアルモードはviにはないため、viしか入ってない環境では使えませんので注意してください。


■特定の範囲の文字列をまとめて削除

最初に紹介するのが特定の範囲の文字列をまとめて削除するコマンドです。最近友達から教えてもらいました。なんでこれをしらなかったのかと思うくらい便利です。

例えば次のようなテキストがあったとします。



<?php

$a = 'foo';


ここで、fooという文字列のどれかの上にカーソルを移動して、「di'」と順番に入力します。そうすると、シングルコーテーションで囲まれた文字列が丸ごと消えます。
fooは1単語なので、「diw」と入力しても消えます。ダブルコーテーションの場合は「di"」と入力します。括弧で囲まれていたら「di(」なり「di]」なりで消えます。

diのかわりにviを使うと、その範囲をビジュアルモードで選択することも可能です。


■複数行の先頭や末尾に同じ文字列を一発で入力

複数行をまとめてコメントアウトしたい場合などに便利なコマンドです。例えば次のテキストがあります。



<?php

/**
 * dummy function.
 */
function dummy()
{
    echo 'dummy!!';
}


dummy関数をまとめてコメントアウトしたい場合、PHPであれば/* */を使って複数行のコメントアウトが可能です。しかし、囲んだ中に同じ形式のコメントがあった場合、最初の*/でコメントが止まってしまうという欠点があります。その場合は全部の行を//でコメントアウトしてしまえば問題ありません。

これをするにはまず、ビジュアル矩形モードを使います。上記のテキストであれば3行目に移動(:3)して、カーソルを先頭に移動(^)させます。
そこからビジュアル矩形モードに移行(Ctrl+v)して、末尾まで移動(G)します。これで、3行目から末尾までの1列目が選択された状態になっています。

この状態で「I」を押してインサートモードに移行し、挿入したい文字列(//)を入力します。入力したらエスケープを押下して少し待ちましょう。そうすると、全部の行の先頭に//が入ってコメントアウトされると思います。

末尾の場合は先頭(^)のかわりに末尾($)に移動して、「A」を押してインサートモードに移行して入力します。先頭、末尾と書いていますけど、ビジュアル矩形で選択できる範囲ならば基本的にはどこでも大丈夫です。

例えば次のプログラム。



<?php

array(
    'foo' = 'foo',
    'bar' = 'bar',
    'baz' = 'baz',
);


=の右側に>を入れたい場合は、=の右側のスペースに合わせて「Ctrl+V」を押してビジュアル矩形モードに移行、「j」を押して3行分選択して「I」でインサートモードにし、>を入力してエスケープを押下します。


■複数行をまとめてインデント

複数行をまとめてインデントするには、ビジュアルモードで複数行選択して、「>」を押下します。アウトデントの場合は同様にビジュアルモードで複数行選択して「<」を押下します。このときインデントされる幅は、shiftwidthという設定で決まります。shiftwidth=4だと4つ分インデントです。


■検索

文字列の上で*を押すと、そこにある文字列を元に検索を行います。手軽に検索できるのでとても重宝しています。
検索中は「n」で次の候補、「N」で前の候補に移動です。


■画面分割


「:sp ファイル名」と入力すると画面を分割してファイルを開くことができます。「:vsp」だと縦分割です。分割した画面の移動は「Ctrl+w」のあとにhjklを押下します。閉じるのは閉じたい画面へ移動して「:q」です。


■コマンドを実行する

コマンドモードで「!」の後にコマンドを続けるとコマンドが実行可能です。「:!ls」とすると、lsコマンドが実行できます。


正規表現を用いた置換

vimでは正規表現を用いて置換することができます。

例えば次のテキストがあるとします。



<?php

$foo = 'foo';

function foo()
{
    echo 'foo';
}


3行目の「$foo = ...」の行で、「:s/foo/bar」とすると「$bar = 'foo';」のように最初に見つかった部分が置換されます。
「u」を押してアンドゥし、再度同じ行で「:s/foo/bar/g」と、今度は最後に/gをつけて入力します。そうするとその行にみつかったすべての文字が置換されます。

このページのすべての行を対象とする場合は「:%s/...」のように%sで行います。特定の行だけの場合は、ビジュアルモードで複数行選択した状態で「:s/...」とします。


■後方参照を用いた置換

例えば次のテキストがあるとします。



<a href="http://www.asial.co.jp/">Asial Corporation</a>
<a href="http://www.phppro.jp/">PHP Pro</a>


これを次のように、a要素の中身をtitle属性として設定します。



<a href="http://www.asial.co.jp/" title="Asial Corporation">Asial Corporation</a>
<a href="http://www.phppro.jp/" title="PHP Pro">PHP Pro</a>


これは次のコマンドで行います。
「:%s/<a href="\([^"]*\)">\([^<]*\)<\/a>/<a href="\1" title="\2">\2<\/a>/g」
PCREの正規表現だと()で囲んでグループ化して、\1とかで後方参照しますよね。vim正規表現だと、括弧を\でエスケープすると同じことが可能になります。


■エディタブルなコマンドモード

通常は「:」や「/」を押してコマンドモードに移行します。ただしこの状態だと、hjklで移動できないとか、過去の履歴を探すのがカーソルキーを使うしかないとか制限があるわけです。
そこで「q:」や「q/」として、qを入力してからコマンドモードに移行します。vimを使ってる人は「q:」で出てきた画面はよくみたことあるんじゃないかなーと思います。
この状態でiを押すとインサートモードになったりするので、過去の履歴を変更したり、最後の行で新たにコマンドを記述して、エンターを押すと実行されます。
先ほどの正規表現のような長めのものを書いたりする際に重宝します。


ご紹介するのは以上になります。このうちのいくつかの情報はid:sotarokに教えてもらいました。ありがとうそうたろう。

この他にもvimといえば設定ファイルで色々設定を変えたり、プラグインで拡張したりできますよね。
僕はいつもGNU screenを256色有効にしてコンパイルし、colorschemeをdesert256にしたりしています。



あんまりプラグインとかは使っていないので有益なお話はできませんが、色々なものがありますのでぜひ探してみてください。

IDE使うほうが補完などが心地よかったりしますが、vimもだいぶ手になじんでいるのでストレスなく文章が書けますね。
この他にも便利なコマンドたくさんあると思いますが、おすすめなものがあったらぜひ教えてください!

最近、日常で気になること

こんばんは、笹亀です。

今日は技術ネタではないのですが、
自分が気になっていることを書いてみます。

■薄型MacBook
今年のはじめごろからずっと噂されている超薄型MacBook(13インチだろうとのこと)の信憑性が気になっています。僕自身、脱Windowsを考えているためMacを使っている人から情報を集めたりして、このMacが発売されたら購入して、社内でも待ちきれずに違うノートパソコンを購入した人に自慢しようとおもっています(笑)

■目指せvim使い
Macの発売されるだろうと考え、長年愛用している秀丸エディタも卒業しようと思っています。Macにしたときにテキストエディタを使うのは、個人的にちょっとどうなのかとおもったりします。やっぱり、プログラムを組むたるものはターミナルで「vim」「emacs」を使うことが「この上なくかっちょいい!」と憧れています。
うちの開発陣は、vim使いかemacs使いがほとんどです。私もvimがまったく使えないわけではないのですが、使いこなせずに1人だけ取り残されてます・・
少しずつ使いこなせるようにvimのサイトを教えてもらい、日々訓練しています。

トヨタカップ
12月7日に開幕する「トヨタカップ」。
トヨタカップは、サッカーのクラブチャンピオンの世界一を決める大会です。
今年も日本で開催されます。
我が日本からも、先日アジアチャンピオンになった浦和レッズが参加します。
レッズとACミランが、ぜひとも戦ってほしいとサッカーファンとして望んでしまいますね。サッカーを見るのが大好きなので見に行ってきます。

■メタボリック症候群
通称「メタボ」、この言葉を聞くと運動しなくちゃとおもってしまいます。
何かと体を動かさない日々が続くので、どうにかしないといけないのですが、
いまさらブートキャンプに入隊するというのはどうだろうか・・
やった人に聞くと、ビリーに殺意を覚えるというし・・
やっぱり嫌なことはせずに、好きなことをして解消できるように努力します。


この中で1番気になるのは、私生活の改善が必要なメタボです。
まずは食生活の改善から始めたいとおもいます。
効果が出てきたら報告してみようとおもいます。
出なかったら報告しません^^;

現在、皆さまより、お勧めなメタボ解消方法を募集しております。
コメントよりどうぞ^^

メタボが気になるかた、一緒に気をつけていきましょう!

VIM-ShellのRPMを作ってみました

最近社内のVim使いの方々の間で、VIM-Shellというパッチが話題になっています。これはVimのなかでシェルを実行できるというもので、EmacsのシェルモードがVimにも欲しいねという話が発端です。
VimCentOSの環境で開発している人が多いこともあり、どうせならとRPMパッケージを作ってみました。

まずは、RPMを作成するために必要なものをインストールします。今回はひとつひとつ入れていきますが、面倒な場合やビルド専用マシンにする場合などは、開発ツールや開発ライブラリを次のようにまとめてインストールしておくと楽かと思います。



# yum grouplist
# yum groupinstall "Development Tools"
# yum groupinstall "Development Libraries"


まずは、何は無くともrpmbuildコマンドが必要ですので、インストールします。



# yum install rpm-build


SRPMを取得するためにyumdownloaderコマンドを使いますので、インストールします。



# yum install yum-utils


yumdownloaderコマンドでSRPMを取得するためのリポジトリを設定します。一から書くのは面倒ですので /etc/yum.repos.d/CentOS-Base.repo をコピーして書き換えます。



# cd /etc/yum.repos.d/
# cp CentOS-Base.repo CentOS-Source.repo
# vi CentOS-Source.repo


baseurlを近くのミラーサイトにします。また、普段は見に行く必要はありませんので「enabled=0」にしておきます。



# CentOS-Source.repo

[base-source]
name=CentOS-$releasever - Base Source
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#released updates
[updates-source]
name=CentOS-$releasever - Updates Source
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/updates/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#packages used/produced in the build but not released
[addons-source]
name=CentOS-$releasever - Addons Source
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/addons/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful
[extras-source]
name=CentOS-$releasever - Extras Source
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages
[centosplus-source]
name=CentOS-$releasever - Plus Source
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#contrib - packages by Centos Users
[contrib-source]
name=CentOS-$releasever - Contrib Source
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/contrib/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5


次に、一般ユーザでRPMを作成するための設定をします。RPMの作成をrootで行うと、SPECファイルの記述ミスや操作ミスなどで環境を破壊する恐れがあるためです。

以下、一般ユーザーで作業を行います。



$ mkdir -p ~/rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ echo "%_topdir $HOME/rpm" >> ~/.rpmmacros


これで、HOMEのrpmディレクトリがRPM作成の作業場になります。

さて、準備が整いましたので、Vimのカスタムパッケージ作りに入ります。
まずは、インストールされているVimのバージョンを調べます。



$ yum list installed | grep vim
vim-common.i386                          2:7.0.109-3.el5.3      installed
vim-enhanced.i386                        2:7.0.109-3.el5.3      installed
vim-minimal.i386                         2:7.0.109-3.el5.3      installed


次にパッケージを提供しているリポジトリを調べます。



$ yum search vim | grep vim-common.i386
vim-common.i386                          2:7.0.109-3            base
vim-common.i386                          2:7.0.109-3.el5.3      updates
vim-common.i386                          2:7.0.109-3.el5.3      installed


先ほど調べたバージョンのパッケージは、updatesリポジトリのようですね。では、updatesからSRPMを取得します。



$ yumdownloader --enablerepo=updates-source --source vim


カレントディレクトリに vim-7.0.109-3.el5.3.src.rpm がダウンロードされましたので、これをインストールします。



$ rpm -ivh vim-7.0.109-3.el5.3.src.rpm


VIM-Shellのパッチをダウンロードして、SOURCEディレクトリへ入れます。



$ cd ~/rpm/SOURCES/
$ wget http://www.wana.at/vimshell/vimshell_1.0_vim7.0.patch.bz2


SPECファイルを修正します。

1. Releaseの末尾にVIM-Shellリリース1の意味で「vs1」を追加
2. Patch行の最後にVIM-Shellのパッチファイルを追加
3. %prep部の後半へVIM-Shellパッチの実行処理を追加
4. %changelog部へ変更履歴を追加



Summary: The VIM editor.
Name: vim
Version: %{baseversion}.%{beta}%{patchlevel}
Release: 3%{?dist}.3<strong>vs1</strong>
License: freeware
Group: Applications/Editors
Source0: ftp://ftp.vim.org/pub/vim/unix/vim-%{baseversion}%{?beta}%{?CVSDATE}.tar.bz2




Patch3100: vim-selinux.patch
Patch3101: vim-selinux2.patch

<strong># VIM-Shell</strong>
<strong>Patch9000: http://www.wana.at/vimshell/vimshell_1.0_vim7.0.patch.bz2</strong>

Buildroot: %{_tmppath}/%{name}-%{version}-root




%patch3101 -p1
%endif

<strong># VIM-Shell</strong>
<strong>%patch9000 -p0</strong>

%if "%{withcvim}" == "1"
mkdir cvim





%changelog
<strong>* Mon Nov 26 2007 Your Name <mail@example.com> 7.0.109-3.3vs1</strong>
<strong>- add VIM-Shell 1.0</strong>



それではビルドします。折角なので、アーキテクチャi686を指定します。また、リリース番号を揃えるためにdist定義を付与します。



$ rpmbuild -ba --target i686 --define 'dist .el5' ~/rpm/SPECS/vim.spec
ビルド対象プラットフォーム: i686
ターゲット i686 用にビルド中
エラー: ビルド依存性の失敗:
        python-devel は vim-7.0.109-3.3.i386 に必要とされています
        libtermcap-devel は vim-7.0.109-3.3.i386 に必要とされています
        libacl-devel は vim-7.0.109-3.3.i386 に必要とされています
        gpm-devel は vim-7.0.109-3.3.i386 に必要とされています
        autoconf は vim-7.0.109-3.3.i386 に必要とされています
        libselinux-devel は vim-7.0.109-3.3.i386 に必要とされています
        gtk2-devel は vim-7.0.109-3.3.i386 に必要とされています
        libSM-devel は vim-7.0.109-3.3.i386 に必要とされています
        libXt-devel は vim-7.0.109-3.3.i386 に必要とされています
        libXpm-devel は vim-7.0.109-3.3.i386 に必要とされています


gccと表示された必要なものをインストールします。



$ sudo yum install gcc python-devel libtermcap-devel libacl-devel gpm-devel autoconf libselinux-devel gtk2-devel libSM-devel libXt-devel libXpm-devel


再度rpmbuildコマンドを実行します。無事コンパイルまでいったようですが、エラーで止まってしまいました。



gui.c: In function ‘gui_start’:
gui.c:142: 警告: ignoring return value of ‘read’, declared with attribute warn_unused_result
gui.c:2423:2: error: #endif に #if がありません
make: *** [objects/gui.o] エラー 1


VIM-Shellのパッチが src/gui.c に不要と思われる「#endif」を挿入しているようですので、これを削除するパッチを作成します。



$ cd ~/rpm/BUILD/vim70/
$ cp src/gui.c src/gui.c~
$ vi src/gui.c
$ diff -u src/gui.c~ src/gui.c > ~/rpm/SOURCES/vimshell_1.0_vim7.0-gui.patch




--- src/gui.c~  2007-11-22 22:47:18.000000000 +0900
+++ src/gui.c   2007-11-22 22:53:47.000000000 +0900
@@ -2420,7 +2420,6 @@
     long_u     old_hl_mask;
     int                off;
     sattr_T    first_attr;
-#endif
     int                idx, len;
     int                back, nback;
     int                retval = FALSE;


では、このパッチをSPECファイルに追加します。



Patch3100: vim-selinux.patch
Patch3101: vim-selinux2.patch

# VIM-Shell
Patch9000: http://www.wana.at/vimshell/vimshell_1.0_vim7.0.patch.bz2
<strong>Patch9001: vimshell_1.0_vim7.0-gui.patch</strong>

Buildroot: %{_tmppath}/%{name}-%{version}-root




%patch3101 -p1
%endif

# VIM-Shell
%patch9000 -p0
<strong>%patch9001 -p0</strong>

%if "%{withcvim}" == "1"
mkdir cvim


再度rpmbuildコマンドを実行します。またもやコンパイルエラーです。



gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2         -o objects/vim_shell.o vim_shell.c
vim_shell.c:120: error: expected ‘)’ before ‘width’
vim_shell.c: In function ‘vim_shell_start’:
vim_shell.c:229: error: 不完全型のポインタへの間接参照
vim_shell.c:230: error: 不完全型のポインタへの間接参照
vim_shell.c:237: error: 不完全型のポインタへの間接参照
vim_shell.c:237: error: 不完全型のポインタへの間接参照
vim_shell.c:238: error: 不完全型のポインタへの間接参照


~/rpm/BUILD/vim70/src/feature.h を見てみると、



#if defined(FEAT_NORMAL)  &amp; &amp; (defined(UNIX) || defined(MACOS_X))
#define FEAT_VIMSHELL
#endif


となっているので「--with-features=tiny」の場合はエラーになるようです。
対処法はいろいろあると思いますが、今回は src/vim_shell.c と src/terminal.c の中身を「FEAT_VIMSHELL」が未定義の場合はコメントアウトするようにしてみます。



$ diff -u src/vim_shell.c~ src/vim_shell.c > ~/rpm/SOURCES/vimshell_1.0_vim7.0-feature.patch
$ diff -u src/terminal.c~ src/terminal.c >> ~/rpm/SOURCES/vimshell_1.0_vim7.0-feature.patch




--- src/vim_shell.c~    2007-11-22 22:55:56.000000000 +0900
+++ src/vim_shell.c     2007-11-22 23:08:08.000000000 +0900
@@ -16,6 +16,7 @@

 #include "vim.h"

+#ifdef FEAT_VIMSHELL
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
@@ -908,3 +909,4 @@

        return rval;
 }
+#endif
--- src/terminal.c~     2007-11-22 22:55:56.000000000 +0900
+++ src/terminal.c      2007-11-22 23:08:08.000000000 +0900
@@ -32,6 +32,7 @@

 #include "vim.h"

+#ifdef FEAT_VIMSHELL
 #ifdef VIMSHELL_DEBUG
 #  define ESCDEBUG
 /*
@@ -1929,3 +1930,4 @@

        return written;
 }
+#endif


作成したパッチをSPECファイルへ追加します。



Patch3100: vim-selinux.patch
Patch3101: vim-selinux2.patch

# VIM-Shell
Patch9000: http://www.wana.at/vimshell/vimshell_1.0_vim7.0.patch.bz2
Patch9001: vimshell_1.0_vim7.0-gui.patch
<strong>Patch9002: vimshell_1.0_vim7.0-feature.patch</strong>

Buildroot: %{_tmppath}/%{name}-%{version}-root




%patch3101 -p1
%endif

# VIM-Shell
%patch9000 -p0
%patch9001 -p0
<strong>%patch9002 -p0</strong>

%if "%{withcvim}" == "1"
mkdir cvim


再度rpmbuildコマンドを実行します。今度こそー!

……。

…………。

………………。

できたー!

早速インストールして、使ってみます。



$ cd ~/rpm/RPMS/i686/
$ sudo rpm -Uvh vim-common-7.0.109-3.el5.3vs1.i686.rpm vim-enhanced-7.0.109-3.el5.3vs1.i686.rpm vim-minimal-7.0.109-3.el5.3vs1.i686.rpm


Vimを起動して「:vimshell」を実行します。おー、Vimの中でシェルが動く!

といった感じで、CentOS5用のカスタムVimパッケージができあがりました。RPMパッケージは作らずに、ソースから「./configure;make;make install」でもいいのですが、同じ環境が複数ある場合は、やはりパッケージを作ったほうが便利かと思われます。

まぁ、私が普段使うエディタはEmacsですので、このパッケージを使うことはほぼないのですが……。