IntelliJ で Emacs 互換の ctrl-r の挙動

ようやく悩んでいた挙動を解決できた感動で久しぶりに記事を書いちゃいました。

JetBrains IntelliJ は、有料ですが、活発に機能追加が行われている素晴らしいエディタです。Sublime Text が流行って、猫も杓子も Goto Anything な昨今、Search Everywhere という同様の機能をきちんと標準でサポートしてくれていますし、その実装も気持ちよく使えるものになっています。最近では Multiple Cursor に対応したりもしました。

なにより、昔はエディタはカスタマイズしまくってこそ、と思っていた私も、最近は、出来るだけ標準で済ませたいという気持ちになってきておりまして、できれば VisualStudio で済ませたいが、Mac じゃ使えないし、そもそも .NET 以外のウェブアプリを VS で開発するわけにもいかないし、と思ったときに、VisualStudio の Mac 版あるいは LL 版みたいな存在が IntelliJ というわけです。

なお、IntelliJ はそもそも Java の開発環境ではありますが、全部入りの IntelliJ を買えば、Ruby や Python や JavaScript などのサポート機能は Plugin として無償で追加できます。 (この Plugin が実はときどきバージョン追従が怪しかったりして、完全に何も考えずに全部入りにならないのが微妙な悩みなのですが、今回の話題とは関係ないので割愛します) ちなみに、Ruby と JavaScript と HTML にしか興味なければ RubyMine というサブセット版が安く売っていたりもします。一般的には PHP + JS の PhpStorm が人気商品なのかもしれません。

で、ようやく本題です。この IntelliJ、デフォルトで Emacs のキーバインディングも入っており、これに切り替えるとほぼOKなのですが、挙動が近しいだけに、かえって微妙な差異に困ったりします。 例えば、ごく一部のダイアログだけキーバインドの変更がきいておらず、Ctrl+G で閉じられなかったりとか。このあたりはまぁ、Esc をたたき直せばいいので、まだ我慢できます。(ちなみに、Search Everywhere の窓が Esc でも閉じない件は、Keymap で Escape を Esc に割り当て直せば閉じました。バグではないかと)

ただ、どうしても誤操作し続けていたものとして、Ctrl+R に関して、Emacs の isearch-backward を使用としたときの挙動の違いがあります。IntelliJ デフォルトの Emacs バインディングでは Ctrl+R は Find Previous / Move to Previous Occurrence に割当たっています。しかし、求める動作はこれではないのです。Ctrl+R を押すと、最初の1回は検索語を聞いてきて、その時に何も入力せずに Ctrl+R をもう一度押すと、直前の検索語でもう一度前方検索できる、という挙動を期待しています。Ctrl+S ではそうなっているので、Ctrl+R でもそうならないかとずっと思っていたのですが、ようやく方法が分かりました。

参考: Customizing IntelliJ for Emacs Compatibility

Ctrl+R を Find... にも追加で割り当てれば良かったのです。ショートカットがダブっているよ、って警告でますが、無視します。これで、Find のダイアログが開いていないときに Ctrl+R を押すとダイアログが開き、そのまま Ctrl+R を押し続けると前の出現を検索する、という挙動が実現できました!

なお、Emacs では incremental 検索からその場で抜けるときは Enter を押しますが、IntelliJ では Esc か Ctrl+G で抜ける必要がありますので、そこは慣れてください。

Ctrl+R 押して検索語入力したつもりがエディタ内で破壊的な編集を行ってしまうという事故を何度か起こしていましたが、これからは快適に使えそうです。

や、標準で満足したいなら、エディタの標準キーバインドになれろって話ではありますが、色々染みついてしまったものもございまして……。

その他の設定変更
  • Editor > General > Editor Tabs > Mark modified tabs with asterisk 編集したファイルのタブにアスタリスクっぽいマークを付ける