タクマ松下のブログ

情報科学科の学生が書く記録。フロントエンドとサーバサイド練習中!です!

Emacsのプラグインciel.elを作った話

EmacsVim、世の中にはたくさんのテキストエディタがありますよね。
僕はコーディングのほとんどをEmacsで行っているんですが、
唯一不便に感じたときにプラグインを作ったときの話です。

動機

EmacsVimと比べると範囲攻撃が弱いです。
というのは特定のスコープを削除する機能が貧弱なのです。
smartparen、expand-regionなどのプラグインでこれらの機能はある程度補えます。
(機能の詳細については省きます。)

しかし僕はある日Vimに出会ってしまったのです。
感動的な機能が最初からたくさん使うことができました。
中でも「ci」には驚かされました。
「ci」というか他にも似た挙動のコマンドはあるのですが、
「ci{」とかするとスコープに応じて{}で囲まれた部分を削除してくれる便利なやつです。

なんでEmacsにはこれがないんだろうと頭を抱えました。
(EvilについてはVim使えばよくねと思います。)

色々探してみると、change-inner.elというものがありました。

github.com

彼はexpand-region、multiple-cusrorの作者様です。
なんだあるのかと思ったのですが、このプラグインはexpand-regionに依存していたのです。
つまり特定のモードでなければ動きません。
またモードだけでなく特定の条件でVimのように動かない問題もありました。

Vimライクに動く「ci」を作りたいと思いました。

つくる

授業中にコソコソとコーディングすること1か月。
様々な問題がありました。Emacs Lispは非常に難解でした。
3か月ほどアルゴリズムを考えたり、手探りで空き時間にコーディングして、
やっとそこそこ動くものができました。

その後GitHubにソースを上げて、Qiitaに投稿しました。
アドバイスをいただいたので色々改変したりしました。

Starがついたりして嬉しかったので、
EmacsのパッケージリポジトリであるMELPAにアップしたいと思いました。
正直英語とかドキュメントとかよくわからないことがあったので、
Twitterで聞いたらまたまた助けてもらえました。

4か月ほど経過したあとでようやくMELPAにもマージされて、
簡単にダウンロードできるようになりました。

できた

github.com

完成品になります。
拙い英語+拙いソースです。
挙動に関しては問題ないのですが、
ユーザカスタマイズに対応できていないので早くどうにかしたいです。
そこらへんの理解が進んだらまたコーディングしようと思います。

機能の詳細についてはここでは省きます。
また時間があれば作る上での問題点、これから追加する機能、
なぜ他のパッケージではダメだったのかを詳細に書こうと思います。

感想

いろいろ助けてもらったことが多かったです。
何かアイデアをアウトプットしたいときは、
とりあえずコミュニティに投げていけば神が助けてくれたりします。
具体性は必要ですが…

また何か感動的なものを作りたいですね。