短いプログラムには「ed」がちょうどいい|フルスクリーンエディタを使わないという選択

edというエディタがあります。

Unixの歴史を知っている人なら、名前くらいは聞いたことがあるかもしれません。

viよりも古いラインエディタで、viのようなフルスクリーンのカーソル編集を行わず、行番号や正規表現を使ってテキストを編集します。

私も長い間、

「歴史的には重要だけど、今さら使う理由はないだろう」

と思っていました。

ところが実際に使ってみると、少し印象が変わりました。

もしかするとedは、短いプログラムを短いプログラムらしく書くためのエディタとして、今でもかなり使いやすいのではないかと思い始めています。

目次

catでは少し不便、viでは少し大げさ

ターミナルで数行のスクリプトを作るだけなら、こんな方法があります。

cat > test.sh

あとは、

#!/bin/sh
echo "hello"

と入力して、Ctrl-Dで終了すればファイルができます。

非常に簡単です。

ただし、cat自体に編集機能があるわけではありません。一度入力した行を後から直したくなれば、別の方法が必要になります。

ではviを使えばいいのか。

もちろん使えます。

vi test.sh

しかし、たった5行のスクリプトを書くために画面全体がエディタになるのは、少し大げさにも感じます。

そこでedです。

edならシェルの流れを止めずに編集できる

例えば、こんなスクリプトを書きます。

$ ed test.sh
a
#!/bin/sh

name="world"
echo "hello $name"
.
w
q

aでテキストを追加し、.だけの行で入力を終了します。

aでは複数行を入力でき、空行も普通に入れられます。

確認したければ、

,n

とします。

1	#!/bin/sh
2
3	name="world"
4	echo "hello $name"

行番号を見ながら、

3s/world/Unix/

とすれば、3行目だけを書き換えられます。

行全体を変更したければ、

4c
echo "$name"
.

削除なら、

3d

です。

間違えたら、

u

で戻せます。

数行から数十行程度のスクリプトなら、これだけでもかなり編集できます。

そして重要なのは、edは編集のために別の「画面」へ移動しないことです。

edは画面を占有しない

viを起動すると、ターミナルは編集画面になります。

shell
  ↓
┌──────────────┐
│              │
│      vi      │
│              │
└──────────────┘
  ↓
shell

これは本格的にコードを編集するときには非常に便利です。

一方、edは普通のコマンドと同じようにターミナルを流れていきます。

$ ls
$ ed test.sh
,n
3s/world/Unix/
w
q
$ sh test.sh
hello Unix
$

編集して、保存して、実行して、結果を見る。

すべてが一本の流れになっています。

端末をスクロールすれば、先ほど表示したコードや入力した編集コマンド、実行結果も確認できます。

ed自身が編集履歴を表示しているわけではありません。画面を書き換えずに出力していくため、端末のスクロールバックにそれらが残るのです。

これはフルスクリーンエディタとはかなり違う感覚です。

「viでよくない?」は確かに正しい

もちろん、

「それなら全部viでやればいいのでは?」

という疑問はあります。

機能だけを比較すれば、その通りです。

viなら短いファイルも長いファイルも編集できます。

しかし、使ってみて気づいたのは、両者の違いは単なる機能の多少ではないということでした。

viは編集する場所に入るエディタで、edはシェルの流れの中で編集するエディタです。

例えば、

調べる
↓
数行のAWKを書く
↓
実行する
↓
結果を見る
↓
1行修正する
↓
もう一度実行する

という作業なら、edはかなり自然です。

編集そのものが目的ではなく、今やっている作業の途中に編集が存在しています。

AWKやシェルスクリプトと相性がいい

普段書くプログラムが、必ずしも何百行もあるとは限りません。

例えばAWKなら、

BEGIN {
    FS = ","
}

$3 > 100 {
    print $1, $3
}

これだけで役に立つことがあります。

シェルスクリプトなら、

for f in *.txt
do
    wc -l "$f"
done

程度で用事が済むこともあります。

Pythonだって同じです。

a = 123 * 354
b = a + 333
print(b)

ちょっとした計算なら、これも立派なプログラムです。

こういう数行から数十行程度のコードを書くために、大きな編集環境が本当に必要なのか。

edを使っていると、そんな疑問が出てきます。

短いプログラムは短いままでいい

もしかすると、フルスクリーンエディタを開くこと自体が、自分のプログラミングに対する感覚にも影響していたのかもしれません。

エディタを開く。

コードを書く。

構造を考える。

関数を作る。

再利用できるようにする。

いつの間にか、

「プログラムを書くなら、それなりのものを作らなければならない」

という感覚になります。

しかし、本来プログラムは3行でも構いません。

困っていることが3行で解決するなら、4行目を書く必要すらありません。

edで書くと、

$ ed calc.py
a
a = 123 * 354
b = a + 333
print(b)
.
w
q
$ python calc.py

となります。

これを見ると、「ソフトウェアを開発している」というより、コンピュータにちょっとした手順を書いて渡しているように見えます。

この感覚が意外と重要なのかもしれません。

プログラムを書くことを大げさに考えなくていい。

必要な処理を、必要なだけ書けばいい。

edの小ささは、そんな当たり前のことを思い出させてくれます。

複雑になったらviを使えばいい

もちろん、長いプログラムをedで書こうとは思いません。

文字単位の細かな編集が増えたり、コード全体を見ながら構造を変更したくなったりすると、viの方が圧倒的に便利です。

そこで、こんな使い分けができます。

短い・単純・行単位
        ↓
       ed
        ↓
編集が複雑になった
        ↓
       vi

例えば、

5s/foo/bar/

で簡単に直せるならed

「この括弧の中の一部分だけ変更して、その下のコードも見ながら……」

となったらvi

s///で直す方法を考えること自体が面倒になったら、その時点でviに切り替えてもいいでしょう。

edで無理をする必要はありません。

編集が作業の一工程ならed、編集そのものが作業になったらvi

このくらいの切り分けでいいように思います。

探していたエディタは、すでにそこにあった?

これまで私は、より使いやすいエディタを探してきました。

しかし、日常的な小さなプログラミングについては、探す方向が逆だったのかもしれません。

必要だったのは、もっと高機能なエディタではなく、

もっと小さなエディタだった。

edには、viのようなカーソル編集がありません。

画面全体にコードを表示し続けることもありません。

以前は、それを欠点だと思っていました。

ところが実際に使ってみると、

  • 画面を占有しない
  • シェルの流れを止めない
  • 数行のコードでも大げさにならない
  • 表示した内容が端末のスクロールバックに残る
  • 行番号と正規表現で簡単な編集ができる

という別の特徴に見えてきました。

短いプログラムには、短いプログラムに合ったエディタがあってもいい。

ワンライナーでは少し苦しい。

catで入力するだけでは修正しにくい。

しかしviを開いて、本格的な編集画面に入るほどでもない。

その間に、ずっとedがいました。

これまで私は、edを「vi以前の古いエディタ」として見ていました。

しかし実際に使ってみると、そうではありませんでした。

編集が作業の一工程ならed
編集そのものが作業になったらvi

そう考えると、edviは新旧の関係ではなく、違う大きさの仕事をするための道具にも見えてきます。

探していたのは、もっと高機能なエディタではなく、短いプログラムを短いまま書けるエディタだったのかもしれません。

edはずっとそこにありました。

見えていたけれど、見えていなかっただけなのかもしれません。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次