Home » テクノロジー・ビジネス

UNIX思想の流れを汲むvim32のちょっとした使い方講座

1 7 月 2009 No Comment

昨日のエントリーでUNIXについて書いたが、UNIXについて書くのであれば、その付属エディタviについても一言、語っておきたい。
僕は現在、UNIX環境でプログラムをするような仕事をしていないので、vi自体はもうかれこれ数十年触ってすらいない。
しかし、viライクなエディタVIM32であれば、たまに使用し、その知的な便利さを味わっている。

ただ、おそらく、現在では、このエディタで出来るようなことは他の手段を使っていくらでも出来ることだとは思う。
それは、僕が知らないだけの話かもしれない。
しかし、それでも僕は敢えて、viライクなエディタvimを使うことがある。それはある種、懐古趣味的なところもあるのだが、一方で、自分が始めて使ったエディタに頭の中、そして指先が調教されてしまっているからでもある。

世の中には、例えば、MAC使いというような人々がまだ大勢いるが、彼等はおそらく、同じことがWindowsで出来たとしても、頭の中から、指の先までMACの世界観にイカれてしまっている人々なのだ。
それほど、OSあるいは、エディタというのは人を支配するものなのである。

さて、それでは今日はめずらしく、実践的なお話。「vim32ならこれが出来る」コーナーである。

そして、お題は...
1)縦に複数行の並んだ文字列を1行に、しかもTAB区切りで横に並べ直したい。
2)すべてのデータの最後にTABを付け加えたい。
3)ブログにアクセスしてくる人のアクセス先を調べる「なかのひと」データを多い順に並べたい。

まずは1)。例えば、下記のようなA列に並んだ都道府県を1行目に横にズラっと並べたくなったとする。

北海道
青森県
岩手県
秋田県
山形県
 ・
 ・
 ・

ようするに上の状態を下の状態にしたい時、どうするのかということだ。

北海道 青森県 岩手県 秋田県 山形県・・・・・

まずはvim32を立ち上げ、テキストを読み込み込む。
具体的には、メモ帳とかで開いたテキストをCtrl-cで全部コピーし、vim32の画面でマウス右クリックでPutするのだ。
すると縦に文字が並ぶ。それからカーソルを1番上の行に持っていく。1Gとか:1[ENTER]と打てば1行目に行く。わかりにくければ、勿論、カーソルキーを使うのも可。
viの特徴でもあるが、ここでkを押し続けてもいい。

さて、一番上の行にカーソルが着たら、ここでJ(大文字のJ)を押し続ける。
すると、下の行がどんどん、ブランク区切りでくっついてくる。そして、全部の行がくっついたら以下のラインコマンドを打つのだ。

:s/ /^I/g

ここで表示されている、^Iというのは、Ctrl-vCtrl-iを続けて入力をするという意味。vim32の世界ではCtrl-iとはTABのことなのである。それをラインコマンドに打ち込むときにはCtrl-vCtrl-iと連続して打てばいいのだ。
さらに言えば、ラインコマンドは、「現在カーソルのある行のブランクをすべてTABに変換」という意味である。
すると、縦に並んでいた文字列は以下のように横一列になるのであった。
そして、その部分をマウスで選び、右クリックでYank。するとバッファにその文字列が溜め込まれるである。
ただし、これは何万行もあるような場合は出来ないと思う。ちょっとした小ネタ程度の話だと思っていて欲しい。

さて、次は2)。
これは1)よりももっと簡単だ。1)と同様にまずはvim32を立ち上げ、テキストを読み込み込む。
そして、以下のようなラインコマンドを打てばいいのだ。

:1,$s/$/^I/

ここでの$は文字の改行前をあらわす。だから、改行の前にすべてTABを入れるという意味になるのである。ちなみに、行の改行直前が$なのに対して、行の最初、すなわち前の改行直後は、であらわされる。

そして最後は3)だ。「なかのひと」のデータは下記のように組織名1(アクセス数) 組織名2(アクセス数) 組織名3(アクセス数) ...というような1行のデータである。
その部分をハイライトさせ、Ctrl-cでコピーする。そしてvim32上でPutするのだ。
するとこのような1行が表示される。

A大学(12) B社(9) C研究所(1) D学園(3)…..

そこで、それらを1)とは逆にそれぞれを1行づつに分離させる。
そのためにはこのように入力すればいい。

:s/) /)^M/g

するとこうなる。

A大学(12)
B社(9)
C研究所(1)
D学園(3)
 ・
 ・
 ・

ここで書いた^Mは、操作的には、Ctrl-vCtrl-mだ。Ctrl-iがTABをあらわすのと同じように、Ctrl-mは改行をあらわすのである。また、最後の/gは一行に複数回あったとしても、最初の1回ではなく、全部に操作を行うために入れる文字列である。

そしてここからはvim32好きには脳内アドレナリンが出る正規表現を使ったラインコマンドの出番だ。

:1,$s/\(.*\)(\([0-9]*\))/\2^I\1

細かく(まどろっこしく)解説するとこうだ。1行目から最後の行まで、なんらかの文字列(\(.*\))が来てから「(」が来て、またなんらかの数字(\([0-9]*\))が来て、「)」で閉じる各行を、まず数字が来て、次にTABを入れてから、最初の文字列が来る行に変換するのである。
もう何度も出てきたのでおわかりかと思うが、このコマンドにおける^Iは、Ctrl-vCtrl-iによって表示される。

すると上記の文字列はこうなる(はず)。

12   A大学
9   B社
1   C研究所
3   D学園

それで、これらの文字列をエクセルにでも持っていって(全行ハイライト時に右クリックでYank選択)降順に整列させればいいのである。

まぁ、これはほんの三例ではあるが、viライクエディタが出来ること、そして小難しいことがお分かりいただけたかと思う。
もし、暇がある方はお試しあれ。

まさむね

Leave your response!

Add your comment below, or trackback from your own site. You can also subscribe to these comments via RSS.

Be nice. Keep it clean. Stay on topic. No spam.

You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">

This is a Gravatar-enabled weblog. To get your own globally-recognized-avatar, please register at Gravatar.