読者です 読者をやめる 読者になる 読者になる

パイプからvimを開く

vim

.pmなファイルをまとめて開きてーよー。と良く思うんだけど、みんなどうやってるんだろう?調べ方が悪かったのか、いい方法がなかなか見つからなかったぞ。

失敗その1*1
ls *.pm | vim

warningがもさもさ出たあげく異常終了。

失敗その2
ls *.pm | vim -

これはlsの出力内容そのものを編集できるだけ。

失敗その3
ls *.pm | xargs vim 

一応全部開ける。やったー、と思ったけどwarningがでて、ターミナルの挙動がおかしくなる(Ctrl-Dとか効かん)ので駄目。

どうも3あたりにナイスなソリューションのヒントが隠されてるのではないかと考えて”vim xatrgs”とかでググッたら、割と残念な情報を発見。

> find . -name "*.c" -print | xargs vim

問題はxargsが起動するプログラムのために標準入力のプロパティを設定しないことで、これがVimにとって問題を引き起こす。Vimが標準入力からの入力を期待するコマンドだからである。タイプした文字がechoされてを押すまで効力を発揮しないという症状がでる。

http://www.kaoriya.net/vimdoc_j/starting.txt

あーそうですか。意味わからんけど。
しかし、ちっこいツールコンパイルして使えばいけるよって書いてあったので、それを試す。

#include <unistd.h>
#include <stdio.h>

main(argc, argv)
    int    argc;
    char   **argv;
{
    close(0);     /* close stdin */
    dup(2);       /* duplicate stdin from stderr */
    execvp(argv[1], argv + 1);
    perror("could not execute program");
}

意味は知らん。
これをstartって名前でぺぺっとコンパイルして、実行権つけて、/usr/local/bin あたりに放り込む。そして、

ls *pm | xargs start vim

おーいけたいけた。
当然こんなのもOK。

find ./lib -name "*.pm" | xargs start vim

シェルのrcで適当なalias設定しとくと楽。

alias vim-="xargs start vim"

いまいちすっきりしないけど、この辺で妥協してやろう。他にいい方法知ってる人がいたら教えてください。

コメントで教えていただいた方法。これはなぜか思いつかなかった!
vim `find ./lib -name ’*.pm’`
追記

たまにぐぐって見に来る人がいるので一応。zshならこれでokです。
自分は、最近これにaliasつけてやってます。

vim lib/**/*.pm

*1:この程度なら vim *.pm でいいんだけど、そういうことではない。