天空のエディタ
前回は結構ヘビーな内容だったので今回は息抜きに軽いのを書いてみます。
やることはこちらのリストに挙げられているコンソールのテキストエディタ順番に試していって感想を書いくことです。何も考えずにやってきます。リストは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版 上
これを現代風にすると次のように置き換えられるかもしれません。
牛は、神とはサンスクリット語で話し、
天空のエディタ | Code of Poem Unknown programmer's programming note.
ご婦人とはLispで話し、
男どもとは機械語で話し、
牛にはC++で話しかける。
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とは違ったものが欲しいです。