UNIX的なアレ

UNIX的なこととかいろいろ

rubymineのキーバインドをemacs風になるようにカスタマイズした

rubymineがなかなかいい感じ

いままでは使用する言語にかかわらず、すべてemacsで開発をしてきました。長年かけて.emacs.dをいじり続けてきたのですごく愛着もあります。

nanapiはPHPで作られていますが、それ以外のプロダクトを一部railsでかいていたりします。

そんなこともあり、弊社のPhpStormを愛しすぎている人の強いプッシュにより、最近はrailsを使う場合はrubymineで開発していたりします。

キーバインドをいじりたい

それでもやっぱりキーマップはemacsがいいんです。手に馴染みすぎている。IDEを使うときはできるだけIDEの作法に従いたいのですが、さすがに苦痛なのでemacs風のキーバインドにしています。

ちなみに、rubymineの標準のキーマップの選択肢にもemacs風のものはあるのですがあまり使い物になりません。

そのため、今回は標準のemacs風のキーマップを自分なりにカスタマイズしました。

keymapの設定ファイル

設定ファイル自体は、IDE上からexportできるのですがjarファイルになっていて変更点とかが確認できません。

ちょっと調べてみるとxmlファイルで管理しているようです。以下のパスにあるファイルに記載してあります。

あ、ちなみにこれはMacの場合です。他のOSだとどうなんだろう。

ls ~/Library/Preferences/RubyMine50/keymaps/Emacs\ copy.xml

変更した点

標準のEmacsキーバインドに以下の変更点を加えたら、わりと使える感じになりました!

100%同じものにはできないのである程度はなれないといけませんが、エディタとしての操作はこれでかなり似ると想います。

ActionID 実施内容 ショートカット
CommentByBlockComment コメントアウト meta SLASH
Editor Copy コピー meta W
EditorBackSpace バックスペース control H
EditorDeleteToWordEnd 前方単語削除 meta H
EditorEnter エンター control M
EditorMatchBrace 対応するカッコへ移動 control meta P, control meta N
EditorNextWord 次の単語へ移動 meta F
EditorPageUp ページアップ meta V
EditorPreviousWord 前の単語へ移動 meta B
EditorScrollToCenter 画面を中央にセット control L
EditorTextEnd エディタの最後へ移動 shift meta PERIOD
EditorTextStart エディタの先頭へ移動 shift meta COMMA
NextSplitter 次のウィンドウへ移動 C-X 0
Replace 置換 shift meta 5

xmlはこんな感じ

上記で書いてない部分もありますが、ほぼこんな感じです。

<?xml version="1.0" encoding="UTF-8"?>
<keymap version="1" name="Emacs copy" parent="Emacs">
  <action id="$Copy">
    <keyboard-shortcut first-keystroke="alt C" />
    <keyboard-shortcut first-keystroke="ESCAPE" second-keystroke="W" />
    <keyboard-shortcut first-keystroke="meta W" />
  </action>
  <action id="CheckinProject" />
  <action id="CommentByBlockComment">
    <keyboard-shortcut first-keystroke="shift control SLASH" />
    <keyboard-shortcut first-keystroke="shift control DIVIDE" />
    <keyboard-shortcut first-keystroke="meta SEMICOLON" />
    <keyboard-shortcut first-keystroke="control C" second-keystroke="control C" />
    <keyboard-shortcut first-keystroke="meta SLASH" />
  </action>
  <action id="Editor Copy">
    <keyboard-shortcut first-keystroke="meta W" />
  </action>
  <action id="EditorBackSpace">
    <keyboard-shortcut first-keystroke="BACK_SPACE" />
    <keyboard-shortcut first-keystroke="shift BACK_SPACE" />
    <keyboard-shortcut first-keystroke="control H" />
  </action>
  <action id="EditorDeleteToWordEnd">
    <keyboard-shortcut first-keystroke="control DELETE" />
    <keyboard-shortcut first-keystroke="meta D" />
  </action>
  <action id="EditorDuplicate" />
  <action id="EditorEnter">
    <keyboard-shortcut first-keystroke="ENTER" />
    <keyboard-shortcut first-keystroke="control M" />
  </action>
  <action id="EditorMatchBrace">
    <keyboard-shortcut first-keystroke="control meta P" />
    <keyboard-shortcut first-keystroke="control meta N" />
  </action>
  <action id="EditorNextWord">
    <keyboard-shortcut first-keystroke="control RIGHT" />
    <keyboard-shortcut first-keystroke="alt F" />
    <keyboard-shortcut first-keystroke="ESCAPE" second-keystroke="control F" />
    <keyboard-shortcut first-keystroke="meta F" />
  </action>
  <action id="EditorPageUp">
    <keyboard-shortcut first-keystroke="PAGE_UP" />
    <keyboard-shortcut first-keystroke="control Z" />
    <keyboard-shortcut first-keystroke="alt V" />
    <keyboard-shortcut first-keystroke="meta V" />
  </action>
  <action id="EditorPreviousWord">
    <keyboard-shortcut first-keystroke="control LEFT" />
    <keyboard-shortcut first-keystroke="alt B" />
    <keyboard-shortcut first-keystroke="ESCAPE" second-keystroke="control B" />
    <keyboard-shortcut first-keystroke="meta B" />
  </action>
  <action id="EditorScrollToCenter">
    <keyboard-shortcut first-keystroke="control L" />
  </action>
  <action id="EditorTextEnd">
    <keyboard-shortcut first-keystroke="control END" />
    <keyboard-shortcut first-keystroke="shift alt PERIOD" />
    <keyboard-shortcut first-keystroke="shift meta PERIOD" />
  </action>
  <action id="EditorTextStart">
    <keyboard-shortcut first-keystroke="control HOME" />
    <keyboard-shortcut first-keystroke="shift alt COMMA" />
    <keyboard-shortcut first-keystroke="ESCAPE" second-keystroke="COMMA" />
    <keyboard-shortcut first-keystroke="shift meta COMMA" />
  </action>
  <action id="NextSplitter">
    <keyboard-shortcut first-keystroke="control X" />
    <keyboard-shortcut first-keystroke="control X" second-keystroke="O" />
  </action>
  <action id="NextTab">
    <keyboard-shortcut first-keystroke="alt RIGHT" />
    <keyboard-shortcut first-keystroke="control X" second-keystroke="N" />
    <keyboard-shortcut first-keystroke="shift meta BACK_SLASH" />
  </action>
  <action id="PreviousTab">
    <keyboard-shortcut first-keystroke="alt LEFT" />
    <keyboard-shortcut first-keystroke="control X" second-keystroke="P" />
    <keyboard-shortcut first-keystroke="shift meta CLOSE_BRACKET" />
  </action>
  <action id="Replace">
    <keyboard-shortcut first-keystroke="shift alt 5" />
    <keyboard-shortcut first-keystroke="shift meta 5" />
  </action>
  <action id="SaveAll">
    <keyboard-shortcut first-keystroke="control X" second-keystroke="control S" />
    <keyboard-shortcut first-keystroke="meta S" second-keystroke="control S" />
  </action>
  <action id="SwitchApply">
    <keyboard-shortcut first-keystroke="control alt ENTER" />
  </action>
  <action id="SwitchDown">
    <keyboard-shortcut first-keystroke="control alt DOWN" />
  </action>
  <action id="SwitchLeft">
    <keyboard-shortcut first-keystroke="control alt LEFT" />
  </action>
  <action id="SwitchRight">
    <keyboard-shortcut first-keystroke="control alt RIGHT" />
  </action>
  <action id="SwitchUp">
    <keyboard-shortcut first-keystroke="control alt UP" />
  </action>
  <action id="TypeHierarchy" />
  <action id="org.jetbrains.plugins.ruby.rails.actions.navigation.SwitchToView">
    <keyboard-shortcut first-keystroke="control C" second-keystroke="V" />
  </action>
</keymap>

とまぁこんなかんじです。ただ、あくまで自分のつかっているemacs風なのでまっさらなemacsにどこまで近いかはわかりません。

まっさらなemacsなんて久しく触ってないのでどこまでが標準のキーバインドなのかあまり覚えてなく...