このブログを検索

ラベル vi の投稿を表示しています。 すべての投稿を表示
ラベル vi の投稿を表示しています。 すべての投稿を表示

2013/02/27

viのtips

カッコにカーソルを置いて % で対応カッコに移動

:!でコマンド実行

2013/01/25

viで一括インデント

perlを書いていて、途中で「これはサブルーチンにしよう」と思ったときに、それまで書いた行を全部インデントしたいがメンドクサイのでそのままにしていたことが多かったのだが、簡単に複数行を一括でインデントできる方法を知った。

(カーソルをインデントしたい範囲の最初の行へ動かす)

v ( --VISUAL-- モードになる)
(カーソルをインデントしたい範囲の最後の行まで動かす)

> 

2008/07/10

「^M」の削除

仕事でlinuxでscriptコマンドでログを取りそれを読んでいるのだが、^Mが行末についてしまう。
viで開いて

%s/^M//g

を実行して消している。 

Ctrlキーを押しながらV+Mで^Mが入力できることを知っただけで喜んでいたのだが、わざわざ viで開くのも同じ置換コマンドを何度も打つのもめんどくさくなってきた。

sedを使えばファイルを開かずにできるとは聞いていたのだが、今日初めて実際にやってみた。

sed 's/^M//g' aaa.log 

画面上にダーっとファイルの中身が表示される。

ファイルを開いたが元のままだ。 

置換されてねーじゃん、とつぶやいたが、別ファイルにリダイレクトするのだと気づいた。

sed 's/^M//g' aaa.log > bbb.log 

こりゃいい!

2008/02/22

htmlタグの置換

最近秀丸で正規表現による検索や置換をするようになってきたのだが、ひとつわからないことがある。多分、簡単にできる方法があると思うので、メモしておく。たとえば、htmlタグの閉じるタグ、なんと呼ぶのかわからないが、
</div>とか、</a>とかいうタグ。

このタグがあったら、その後ろで改行したいというとき。検索するのは、 </.*> とやればよい。しかし、それを置換するときに、</.*>\n とすると、.*の部分を検索対象文字列に置き換えてはくれない。
・・・わかりました。
検索:(</.*>)
置換:\1\n

\1というのは、()で囲った検索内容を変数とするものです。複数あれば、\1,\2...と使えます。yy/mm/ddを yy年mm月dd日に置換するような場合に使います。これは便利だ。多分viとかでも同様のやり方があるはず。
...
\1とかはlinuxも同じだ、と思ったら、</.*>がうまくいかない。1回目はうまくいくが、連続すると/なしの普通のタグが引っかかってしまう。

2008/02/08

秀丸とvi

パソコンについては、何かをしたいからそのために必要なものを買う、ということよりも、とりあえず買ってみて、何ができるんだろうと模索するところがある。オタクと違うのは、ただ高性能を追求するのではなく、最終的には道具として使用するところである。

わたしはログファイルなどを検索したり置換したりするときはいつも秀丸を使っていたのだが、何万行もあるログから、その半分くらいの行を置換したときに、高速化しても20分くらいたっても終わらなかった。行頭が特定の文字+:で始まる行を削除しようとして、下記のような正規表現を指定した。

^ETHER:.*

時間がかかりすぎるので中断して、cygwinのviでやってみたら、数秒程度で終わった。

秀丸の弱点はほとんどないと思っていたのだが、これは意外だった。正規表現処理が遅いのだろうか?

viはとっかかりは悪いが使い込めばなんでもできることがわかってくる。

2007/12/03

viで大量の行を移動する

viで、大量の行をカット&copyして移動するのが面倒である。

 100,200 copy 300

 というようにすると100-200行目を300行目に挿入してくれるということはわかったのだが、
その3つの数値を記憶しなければならない。

copy開始の行にカーソルを合わせてCtrl+Gを押し行番号を記憶、終了の行番号を同様にして記憶、そしてターゲットの行番号を確認してコマンドを実行する。

グラフィカルにこっからここまでをコピーしてここにペタリ、という操作ができない。多分なんかいい方法があるのだと思うんだけど・・・ 


さすがvi。いろいろ方法があったが、簡単なのは以下の方法。 

V を入力してカット範囲を選択すると反転する。

目的の範囲が定まったら : を打つと :'<,'>と表示される。

そこにya a と続けると、反転した範囲が a というバッファにコピー(yank)される。

そして貼り付けたい場所にカーソルを持っていって、"apとすれば張り付く。

行番号を一切知る必要がない。

ちなみに私はviとvimについてのみ書かれた1500円する本を一冊持っている。あんまり見ないけど。

それから私の使っているviはvimだった。

Redhat9のは6.1, cygwinのは7.0。 

私は家でも仕事でもメインのPCはWindows,仕事場はXP、家ではvistaである。

テキストエディタは秀丸を使っている。Wordを使う事はまずない。

大きなファイルをフィルタリングするような必要がある場合は、秀丸の正規表現を使った置換が使えればそれでやる。これでだいたいできる。

できない場合は、cygwinでgrepコマンドを使う。たとえば PassedまたはFailedと書いてある行のみを抜き出したい場合。

 cat aaa.log|grep -e Passed -e Failed>new.log

秀丸でもできるのかもしれないが私は最近覚えたこの方法を使う。 

viは、cygwinで使うファイルを開く時とか、メイン以外のlinuxにログインしたときなどに、仕方なく使う。大幅に編集する必要がある場合はメインのPCに持ってきて秀丸で編集している。

しかし最近はviに慣れてきて、秀丸と大差ない機能があることがわかってきた。むしろ、正規表現を使った検索や置換はviというかunixの世界が元祖である。