ふと思い立ってテキストエディタを作り始めたんだけど、しばらく(少なくとも今月いっぱいは)手をつけられなくなりそうなので公開しちゃいます。仕様面でも技術面でも、何かアドバイスいただけると嬉しいです。
staccato_editor.zip(5.23 MB)
特徴等はこんな感じです。(主に readme.txt から抜粋)
■特徴
○Ctrl や Shift 以外のキーを modifier key として利用可能
・f+jkil で左下上右に移動
・s+jkil で選択領域の拡張/縮小
・t+jl でタブ切り替え
○複数のカーソルを持てる
といった特徴を持った、少なからず変態的なエディタです。
■動作環境
今のところ Windows でのみ動作します。
たまに Windows でもうまく動かない場合があるようです。
(もしかすると USB キーボードではうまく動作しないのかもしれません。)
exe は py2exe で作成したのですが、gdiplus.dll や msvcp71.dll が足りないと言われることがあるかもしれません。その場合は、マイクロソフトが配布している
・vcredist_x86.exe(vc7ランタイムのインストーラ)
・dotnetfx.exe(.NetFramework1.1以降のランタイムインストーラ)
などをインストールしてください。
(情報源:
py2exeモジュールについて)
■注意点
現在はまだファイル保存機能を実装していない(アプリケーション終了の際、編集されたバッファがあっても特に警告等を出さずに終了してしまいます)のでご注意ください。
そういう意味では、今一番近い位置にいるエディタは
チラシの裏 かもしれません。
あと、アクション(たとえばカーソル移動)のたびに画面全体を再描画しているため、表示がすごく遅いです。データの持ち方や描画方法が確定したら、処理を最適化する予定です。
エディタの特徴や使い方は readme.txt や tutorial.txt を見ていただくとして、ここでは開発の動機や構想、実装した感想なんかについて書いてみます。(箇条書きレベルですが。)
■Staccato について
◆既存エディタの不満点(操作まわりについて)
・Windows 系のエディタはカーソルキー等に手を伸ばすのが面倒くさい。
・vim はモードの切替が面倒。日本語ユーザは IME の状態も頭の中にフラグとして持ってるので、モードを持たないエディタのほうが頭に優しい気がする。
あと論理行移動が gj/gk だとかバッファの切替が :bn/:bp だとか、連続して実行したい系のコマンドを 2〜3 キーにアサインしてるのが気に食わない。
・emacs は Ctrl 押しっぱなしで小指が疲れる。特に Ctrl が変な位置にあるキーボードだと地獄。
◆上記の打開案(?) - Staccato
f を押しながら jikl でカーソル移動とかやってもいいんじゃないか、と思いついた。
カーソル移動系のコマンドだけキーリピート有効にして、通常のキー入力はリピートしないイメージ。これで困るのって「ちょwwwwwwwwww」とか「sugeeeeeeeeeeeeeeeeee」とか入力するときくらい、のはず。
○利点
・そこそこ豊富な組み合わせ
押しやすいキー(片手あたり15キー)、左手→右手や右手→左手のキーアサインに限定しても、(15 * 2) * 15 = 450 通りの組み合わせが使える。
・操作をある程度統一できる
例えば j が左移動、l が右移動と決めていた場合、f-j/f-l がカーソルの左右移動で、t-j/t-l がタブの左右移動で、d-j/d-l が backspace/delete で・・・のように一貫したキーアサインが行える。
・Ctrl や Esc の位置に依存しない
Thinkpad みたいに使いにくいキーボードでも大丈夫。いろんな環境で違和感なく使える。
○欠点
・KeyDown の時点ではそれが文字入力なのか modifier key なのか判断できないので、KeyUp 時に入力することになる
入力の際タイムラグが一瞬ある。ちょっと気持ち悪い。
・キーを押す時間が長いと、連続したキーストロークが modifier key とみなされてしまう。
個人的には "while" とか入力しようとしたときに発生しやすいみたい。
・通常のキーボードは 2〜3 キーロールオーバー
Shift や Ctrl は同時押しに強いようにキーマトリックスが構成されていることも多いけど、それ以外のキーは同時押下に弱いだろうから、キーの組み合わせはあまり使えない。
○欠点の解決方法
・前者の 2 個についてはキーをすぐ離す癖をつければ大丈夫。ピアノをスタッカートで弾くイメージで。
→これにちなんで、この入力方式を勝手に Staccato と名付けてみた。このエディタも StaccatoEditor としておいた。
・もう一つの欠点(n キーロールオーバー)
気になる人は Realforce 買ってください>< とか言いたいところだけど、自分自身 Thinkpad で使いたいから当面は普通のキーボードでも使えるような形(2 キーまでの組み合わせ)で実装しよう。
◆実装してみた感想
・なかなか便利。ホームポジション以外のキーがやたら遠く感じるようになった。
・でもキーアサインが非常に覚えにくい。ここはなんとか改善したい。
・f-【何かのキー】 という組み合わせは使い切ってしまった感がある。
できれば論理行移動で選択範囲変更、なんてのもちゃんと割り当てたかったんだけど、キーの組み合わせを 2 キーまでに限定すると結構辛い。
■複数カーソルについて
◆既存エディタの不満点(カーソル周りについて)
複数の場所に対して同じ編集を行いたいことがたまにある。
・矩形選択入力だと縦並びの連続行についてしか操作できない。
特定の文字で検索して、そのすべてのヒット位置に対して編集とかやりたい。
・矩形選択だと、何度も同じような矩形選択を行うことになる。
例えば 2、4、6 列目を消したいようなケースだと、3 回矩形選択を実行する必要がある。
また、入力ミス→undo すると領域も消えるので再選択しないとダメ。(これはエディタの実装の問題ですが。)
・上記の問題はマクロを使えば解決するんだけど、マクロの実行は途中経過が目に見えないからわかりにくい。
◆上記の打開案 - 複数カーソル
・複数カーソルを保持していれば、動かしながら動作確認ができるのでより直感的なはず。
◆実装してみた感想
・確かに望んだ操作はできるようになったんだけど、操作が非常にわかりにくい。
・現在はカーソルの状態としてアクティブ/非アクティブの 2 パターンしか持ってないけど、このやり方だと 単語検索→そのうちいくつかをピックアップして一括置換 というのがやりにくい。もう一つパターンを持つべきかも。
■その他技術的な問題
・wxPython で作ってたけど、IME ON のときに Staccato で入力できないようであれば別のプラットフォームに乗り換えるかも。
・もしネイティブアプリケーションでも Staccato をうまく扱えない、というのであればもっと低レベルで実装するかも。
この辺りの詳細は明日にでも別エントリで挙げます。
(2008-05-21 追記)
書き忘れていることがいくつかあった(まだあると思います)ので、ちまちま追記します。
・この入力方式はエディタでやってるから「スタッカートっぽく」なんて面倒なことをやる必要があるけど、キー入力を行わないアプリケーションであればもっとストレスなく操作できるんじゃないかと。気が向いたら StaccatoEditor にファイラの機能も載せてみようかなとか企み中。
・実はファイル保存を実装していないのは、キーアサインに迷ってるからだったり。他のキーにならうと j-s なんかで保存するのがよさげですが、Staccato という入力方式は、他の入力方式に比べれば意図せずにコマンド実行してしまう可能性が高いわけで。ファイル保存みたいに重要なコマンドはミスが少ない場所に置きたいなと思って・・・そのまま思い付かないので放置してたります。
(2008-07-05 追記)
Staccato の利点として「既存のショートカットキーとかち合わない」というのを書き忘れてました。
Eclipse や Firefox で vim/emacs 風のキーバインドを実現するプラグインやアドオンがあるわけですが、もともと割り当てられているショートカットとかぶるので何かと不満がたまりやすかったりします。Staccato はショートカットの体系が違いますので、そういう問題は発生しません。
その反面、ショートカットキーのカスタマイズ機能なんかでは対応できないので、利用の範囲はものすごく限られるわけですが。
的なコマンドはないですか?