Code of Poem
Unknown programmer's programming note.

天空のエディタ

前回は結構ヘビーな内容だったので今回は息抜きに軽いのを書いてみます。

やることはこちらのリストに挙げられているコンソールのテキストエディタ順番に試していって感想を書いくことです。何も考えずにやってきます。リストはArch LinuxのアプリケーションのリストなのでArchを使えばインストールが楽なのでQEMU/KVMの仮想マシンにインストールしたArch Linuxを使います。

全部試すには時間がかかりそうなので少しずつ書き足していく形にします。

環境設定

作業用のダミーテキストを用意します。テキストはLorem Ipsumという文章です。こちらのサイトを使わせてもらって生成しました。

主な内容と目標はLorem IpsumのテキストファイルをRCSのバージョン管理下に置くことです。RCSは知っている範囲では、利用する場面があり、使い方を覚える価値のあるものでは最も簡単に使えるバージョン管理ツールです。正確にはリビジョン管理システムです。すでにGitとか使ってる人なら15分もあれば使えるようになると思います。もし今までバージョン管理ツールを使ってなかったとしても、試しに使い始めるのにも適してると思います。

RCSはそこそこの規模のあるプロジェクトを管理するのには向いてません。プロジェクト単位でのバージョン管理を行うためのものとしてはCVSやSubversionなどがありますが、そういった用途にはGitやMercurialを使った方が良くて、皮肉にも本格的なバージョン管理ツールであるがゆえに過去のものになりつつある印象を受けます。RCSは本格的なバージョン管理ツールではないがゆえに、逆に簡単なツールとしてまだ利用価値が残っているように思います。

Gitなどの本格的なものとの違いはファイル一つの単位でバージョン管理をすることでしょうか。あとロックという概念があるのも特徴的です。チェックインしたファイルはチェックアウトしてロックするまで編集できなくなります。ロックするとロックされたファイルは他のユーザーはチェックアウトできなくなり、ロックしたユーザーはそのファイルを変更できるようになります。文章にすると分かりづらいですが試してみればすぐに使えるようになると思います。

rcs ci foo.txt
RCSにfoo.txtをチェックインします。初めてチェックインする場合はそのファイルの説明を入力するように促されます。それ以降のチェックインではメッセージ(コミットメッセージ)を入力するように促されます。チェックインすると元のファイルは一旦消えますので初めて使うときにはびっくりするかもしれません。foo.txt,vのようなRCSの管理下に置かれたファイルによって復元できるので大丈夫です。
rcs ci -u foo.txt
RCSにチェックインするのは同じですが、アンロックされた状態で元のファイルが残ります。ファイルは読み込みのみ可能な状態です。
rcs ci -l foo.txt
RCSにチェックインするのは同じですが、ロックされた状態で(チェックアウトされて)元のファイルが残ります。ファイルは編集可能な状態で続けて編集することが出来ます。
rcs co [-u] foo.txt
RCSからfoo.txtをチェックアウトします。アンロックされた状態で取り出します。読み込みのみ可能なコピーが手に入ります。
rcs co -l foo.txt
RCSからfoo.txtをチェックアウトします。ロックして取り出します。編集可能なコピーが手に入ります。
rcs log foo.txt
RCSにチェックインされたfoo.txtの履歴を表示します。他にも rcs log -L -R RCS/* などとすると現在チェックアウトされている全てのファイルを表示する使い方も出来ます。
rcs diff foo.txt
作業ファイルの状態と、チェックインされているリビジョンの状態との差分を表示します。

作業しているファイルと同じディレクトリにRCSという名前のディレクトリがあるとそのディレクトリの中にRCSのリビジョンのファイルが置かれるので複数のファイルを管理する場合はRCSという名前のディレクトリを作っておくとファイルが散らからなくて良いです。

rcs COMMAND foo.txt にはそれぞれCOMMANDに対応する独立した実行ファイルも用意されていて、タイピングを節約することが出来ます。

長いコマンド 短いコマンド
rcs ci foo.txt ci foo.txt
rcs co foo.txt co foo.txt
rcs log foo.txt rlog foo.txt
rcs diff foo.txt rcsdiff foo.txt

e3

最初の標的はe3というエディタです。

かなり長いですが何も出来ていません。グダグダになってしまいました。

動画ではソースを見るのをスキップしてしまいしたが、すべてアセンブリ言語で書かれてます。

e3も非常に興味深いプログラムですが、この動画やっていることでもう一つ重要なのは、cowsayというプログラマにとって左手の小指の次に重要なツールをインストールしていることです。

もし「ただ牛さんがしゃべるだけだよね?」とお思いなら、あなた牛に向いてません。来世はきっとペンギンでしょう。

インドと呼ばれる国を中心に普及しているヒンドゥー教では牛は神聖であるとされています。牛に祈ることはニルヴァーナをもたらすとまで言われているそうです。したがってcowsayによって言葉を表示することは牛に祈ることと同等であり、それは神の使いとの対話であると考えることが出来ます。

日本においても近年の牛への信仰の高まりはドラゴンクエストという聖典において見ることが出来ます。以前はドラクエでは馬が信仰されていました。馬車や馬の糞といった重要なものは馬に関わるものでした。しかし、最近は天気を予言する牛や牛の糞といったものが登場するようになり、馬と同等、あるいはそれ以上の重要な地位を獲得するに至りました。

cowsayは神聖であるがゆえに諸刃の剣でもあります。何でもかんでも牛に喋らせればいいというわけではありません。本来ならサンスクリット語のような言語を使って会話するべきですが、残念ながらGoogle翻訳にサンスクリット語がないため極めて習得の難しいツールとなっています。サンスクリット語をマスターすることがプログラマにとっての鬼門といえるでしょう。

パタヘネの名で知られる密書には次のような記録が残されています。

余は、神とはスペイン語で話し、
ご婦人とはイタリア語で話し、
男どもとはフランス語で話し、
馬にはドイツ語で話しかける。

フランス王 シャルル五世 1337-1380

パターソン&ヘネシー コンピュータの構成と設計 第3版 上

これを現代風にすると次のように置き換えられるかもしれません。

牛は、神とはサンスクリット語で話し、
ご婦人とはLispで話し、
男どもとは機械語で話し、
牛にはC++で話しかける。

ヌー

天空のエディタ | Code of Poem Unknown programmer's programming note.

ee

2番目の標的はeeというエディタです。まったく触ったことありません。

dte

3番目の標的はdteというエディタです。

動画だけでは伝わりづらいとは思うのですが、実際に操作してみるとモダンな感じの操作感が得られます。日本語もちゃんと扱えるし、タブの表示や切り替えも扱いやすいです。

JED

4番目の標的はJEDです。

S-Langについてもっと触れたかったのですが、何も出来ないうちに終わってしまいました。

動画の中でM-e (Alt+e あるいは Esc e) にeval-bufferを割り当てようとしててうまくいかなったのは解決しました。~/.jedrcで一度特定のキーバインディングのファイルをロードしないとダメっぽいです。

% ~/.jedrc
() = evalfile("emacs"); % 書いておかないとsetkeyが効かない
setkey("evalbuffer", "\ee");

また、S-Langのファイル.slの中にsetkey(..)を書いて、編集中にそのバッファをevalbufferしても有効にならないのは、setkeyをlocal_setkeyにすることで反映されることが分かりました。local_setkeyについては、配布パッケージの中のsrc/jed-0.99-19/doc/txt/jed_faq.txtというファイルにかかれていました。evaluate_cmd (M-X、Shift+Alt+x)でもsetkeyではなくlocal_setkeyを使わなければ有効になりませんでした。

M-x compileの出力がぐちゃぐちゃになるのは、GCCのオプションで診断メッセージの色付けをしないように指定することで解決しました。具体的には-fno-diagnostics-colorを指定するか、-fdiagnostics-color=neverを指定します。GCCのオンラインドキュメントで見つけられます。

# Makefile
CXXFLAGS=-fno-diagnostics-color
.PHONY: all
all: foo

JOE (Joe's Own Editor)

5番目の標的はJOE (Joe's Own Editor)です。

よく似た名前のJOVE (Jonathan's Own Version of Emacs)というエディタもあって触ったことあるのですが、アプリケーション一覧にあがっていないため試さないでおきます。

mcedit

6番目の標的はmceditです。

Midnight Commander (mc)に付属するエディタです。

キーバインドは色々変更したい箇所がありますが、とりわけウィンドウの切り替えだけを割り当てておきます。

/etc/mc/mc.default.keymap を ~/.config/mc/ の中に mc.keymap という名前でにコピーします。

Emacs スタイルが良い場合は /etc/mc/mc.emacs.keymap をコピーします。

[editor]セクションのWindowList、WindowNext、WindowPrevにキーを割り当てます。

[editor]
WindowList = ctrl-alt-l
WindowNext = ctrl-alt-n
WindowPrev = ctrl-alt-p

WindowPrevは2つのウィンドウを交互に入れ替えるだけでした。逆順に回るというものではないです。

ついでに検索の繰り返しと、置き換えの繰り返し、ファイルのクローズにも割り当てておきます。

[editor]
Close = ctrl-w
SearchContinue = f17; shift-f7
ReplaceContinue = f14; shift-f4

Closeはちょっと挙動がおかしいです。Ctrl+Wを連続でタイプしても一度カーソルを動かさないと閉じれないです。

micro

7番目の標的はmicroです。

密かに注目していたエディタで、少しだけ触ったことがあります。

動画ではプラグインを ~/.config/micro/plug にプラグインを手動でコピーしてしまっています。手動でやらなくても、コマンドラインで micro -plugin [COMMAND] のようにすることで操作ができます。COMMANDにはlist、install、update、remove、search、availableが使え、それぞれリスト表示、インストール、アップデート、削除、検索、利用可能なプラグのリスト表示ができます。

microのコマンドバー(Ctrl+E)で plugin [COMMAND] のようにすることでも管理できます。

plugin available とすることで利用できるプラグインのリストが得られます。

micro -plugin available
Available Plugins:
comment
editorconfig
fish
fzf
crystal
filemanager
quoter
gotham-colors
snippets
zigfmt
pony
joinLines
bounce
fmt
misspell
wc
wakatime
go
nordcolors
manipulator
quickfix
bookmark
scratch
yapf
jlabbrev
monokai-dark
aspell

公式のリポジトリに登録されているものはこれだけです。あんまり数多くないです。ちょっと期待しすぎました。

Minimum Profit

8番目の標的はMinimum Profit (mp)です。

一度インストールに失敗して撮り直しています。

ちなみに…OK Computerのリリースは1997年でした。

nano

9番目の標的はnanoです。

nanoは割と使い慣れてます。使い方よりも設定を中心にやってます。

ne

10番目の標的はneです。

触ったことありません。"nice editor"の略だそうです。

Backspaceが次の1文字を削除してしまう(Deleteのようになってしまう)のを直す方法は2つ見つかりました。~/.ne/.keysに次のように書き加えます。

KEY 0x7f BS
KEY 0x115 DC

環境変数TERMをgnomeにしてもうまくいくようです。TERM=gnome ne のように起動します。この方法は使わないです。

Ctrl+矢印やCtrl+Homeなどに割り当てるのはかなりややこしいです。次のページが参考になります。

slap

11番目の標的はslapです。

一度インストールに失敗して撮り直しています。

Tilde

12番目の標的はTildeです。

天空シリーズこれで最後です。インストールがちょっと厄介でした。

まとめ

すべてのエディタの特徴と感想を表にまとめておきます。

名前 ライセンス インストール 日本語 操作 設定 拡張 単語補完 シェルコマンド マルチバッファ コメント
e3 GPLv2 選択 - - - - アセンブリ言語で書かれてます。日本語は表示はされますがカーソル位置がおかしくなります。WordStar、Emacs、Pico、Vi、Neditの編集モードが選べます。
ee BSD 2-caluse 独特 少なめ - - - - コマンドとメニューから機能にアクセスできます。キーバインドは独特です。設定によりEmacs風にもできます。
dte GPLv2 OK 方向キー 普通 dterc あり あり 初期キーバインドが直感的でタブも使いやすいです。コマンドモードがあります。ctagsをサポートしてます。
JED GLPv2 OK Emacs 豊富 S-Lang あり あり あり Emacs風のエディタでS-Langによる拡張が魅力です。S-Langのドキュメントはしっかりしていますが、ファーストステップのガイドがないためどのように始めたらいいのか分かりづらいのが難点です。
JOE GPLv2 OK 選択 普通 - あり M-TAB 内部ターミナル あり キーバインドをオリジナル、WordStar、Emacs、Picoのモードから選べます。コマンドモードがあります。
mcedit GPLv3 OK 方向キー 普通 マクロ あり M-TAB 可能 M-u あり ファイルマネージャーmcに付属するエディタで、mcと相性が良いです。ファンクションキーを多用します。色設定などはmcの設定を引き継ぎます。
micro MIT OK 方向キー 可能 Lua あり あり あり タブが使いやすいです。キーバインドが覚えやすいです。コマンドモードがあります。Luaのプラグインによる拡張が可能で、プラグインマネージャもあります。公式のプラグインはあまり数がありません。
Minimum Profit Public Domain ひと手間 方向キー 豊富 MPSL あり 可能 あり 日本語の変換ウィンドウが変な位置に表示されます。メニューにビルドがあったりしてプログラミングで使われることを想定されています。ctagsのサポートは使いやすいです。MPSLという専用のスクリプト言語による拡張が可能です。
nano GPLv3 OK Pico 普通 - あり 可能 C-t あり 安定した標準的なエディタです。設定ファイルにより動作の変更とキーバインドの変更が簡単にできます。シンタックスハイライトの追加もできます。初期のキーバインドは基本的なカーソル移動はEmacsスタイルと方向キーが使えますがその他はPicoに慣れていなければ独特です。
ne GPLv3 やや手間 OK 独特 可能 マクロ あり M-i - あり 方向キーによるカーソル移動を基本としているにも関わらず、Ctrl+方向キーなどの入力が奇妙な動作をするため初期状態のキーバインドはかなり使いづらいです。簡単なマクロが組めます。マクロをキーに割り当てるなどのカスタマイズが可能です。
slap MIT 厄介 方向キー - - あり Node.jsのアプリケーションです。対応するNode.jsのバージョンが古いため新しいNode.jsでは動きません。GUIのテキストエディタのような左サイドバーが特徴的ですが使い勝手はいまいちです。マウスをサポートしています。編集はWindows風です。
Tilde GPLv3 ひと手間 方向キー 可能 - あり - あり Debianなどではaptで簡単にインストールできます。メニューやキーバインドなどがWindowsの操作感に最も近いです。日本語入力の変換ウィンドウが変な位置に表示されるため入力しづらいです。

使用検討

コンソールで使い捨てのスクリプトや実験用のコードを書くときなどnanoをよく使います。nanoに求められるのは完全なプログラミング環境を提供するような多機能や拡張性ではないだろうから今あるのはあるべき姿です。nanoはいってみればすごく堅実なエディタではないかと思います。余計なものを可能な限り排除して最低限の編集機能だけを備えてますが、単純に文字を入力するだけしかないものよりはもう少し機能があります。コンソールでもうちょっと手の込んだものを書くときは、これまでEmacsしか使ってませんでした。nanoかEmacsかのどちらかしかないのでは極端すぎる気がします(Emacsだけ使っていればそれで良いという気は薄れてきました。もう少し色々試してみたいです。)。欲しいのはその中間くらいにあるエディタです。すると今回試した中ではやはりmicroがよさそうです。JEDもミニミニEmacsという感じで悪くなさそうですがEmacsとは違ったものが欲しいです。