Xcode + IDETextKeyBindingSet.plist

f:id:provdr:20150814125604j:plain

Xcodeではプラグインを用いて様々な機能を追加する事ができます。 XcodeBoost なんかは結構使っている人も多いと思います。私もずっと使っていたのですが、マシンが非力なせいか微妙にアクションにラグを感じます。よく使うのは'Copy Line'や'Paste Line'等だけなのでIDETextKeyBindingSet.plistを編集して自分で作ることにしました。

結果は一目瞭然で、私の非力なMBP 13" 2011でも爆速です。

まずは/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resourcesを開きます。その中にあるIDETextKeyBindingSet.plistのバックアップをとっておき、編集しましょう。

Writing Directionキーの下に

    <key>My Bindings</key>
    <dict>
      <key>Duplicate Line</key>
      <string>selectLine:, setMark:, deleteToMark:, yank:, moveToBeginningOfLine:, yank:, moveUp:</string>
      <key>Copy Line</key>
      <string>selectLine:, copy:, moveToBeginningOfLine:</string>
      <key>Cut Line</key>
      <string>selectLine:, cut:, moveToBeginningOfLine:</string>
      <key>Delete Line</key>
      <string>selectLine:, delete:</string>
      <key>Paste Line</key>
      <string>moveToBeginningOfLine:, moveDown:, paste:, moveLeft:, moveToBeginningOfLine:</string>
      <key>Insert New Line</key>
      <string>moveToEndOfLine:, insertNewline:</string>
      <key>Line Up</key>
      <string>selectLine:, setMark:, deleteToMark:, moveLeft:, moveToBeginningOfLine:, yankAndSelect:</string>
      <key>Line Down</key>
      <string>selectLine:, setMark:, deleteToMark:, moveToEndOfLine:, moveRight:, yankAndSelect:</string>
    </dict>

これをコピペしてXcodeを再起動すれば・・・

f:id:provdr:20150814125606j:plain

こんな感じで新しいアクションが追加されていて、デフォルトで用意されているもの同様ショートカットキーを当てることができます。

Line Up, Line DownはXcode標準のものより軽いです。また、検索してみるとこういったカスタムアクションでのラインの上げ下げにcopy:, paste:を多用しているものが見受けらるのですが、これをしてしまうと予めコピーしていたものが上書きされてしまうのであまりいいアプローチではないです。
Duplicate Lineもクリップボードを使わない様に弄りました

因みに、以前からXcodeではこういったキーバインディングが使えるのにXcode以外では使えない環境に違和感を感じていました。~/Library/KeyBindings/DefaultKeyBinding.dictというファイルを置くことでシステム全体で使えるカスタムアクションを追加できます。私はこんな感じで使っています

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>@
        </key>
        <array>
            <string>moveToEndOfLine:</string>
            <string>insertNewline:</string>
        </array>
        <key>@^</key>
        <array>
            <string>selectLine:</string>
            <string>setMark:</string>
            <string>deleteToMark:</string>
            <string>moveLeft:</string>
            <string>moveToBeginningOfLine:</string>
            <string>yankAndSelect::</string>
        </array>
        <key>@^</key>
        <array>
            <string>selectLine:</string>
            <string>setMark:</string>
            <string>deleteToMark:</string>
            <string>moveToEndOfLine:</string>
            <string>moveRight:</string>
            <string>yankAndSelect::</string>
        </array>
        <key>@d</key>
        <array>
            <string>selectLine:</string>
            <string>copy:</string>
            <string>moveDown:</string>
            <string>paste:</string>
            <string>moveLeft:</string>
        </array>
        <key>^c</key>
        <array>
            <string>selectLine:</string>
            <string>copy:</string>
            <string>moveToBeginningOfLine:</string>
        </array>
        <key>^d</key>
        <array>
            <string>selectLine:</string>
            <string>delete:</string>
        </array>
        <key>^v</key>
        <array>
            <string>moveToBeginningOfLine:</string>
            <string>moveDown:</string>
            <string>paste:</string>
            <string>moveLeft:</string>
            <string>moveToBeginningOfLine:</string>
        </array>
        <key>^x</key>
        <array>
            <string>selectLine:</string>
            <string>cut:</string>
            <string>moveToBeginningOfLine:</string>
        </array>
    </dict>
</plist>

これでXcodeに追加したものと全く同じ内容のアクションが例えばSafariのテキストフィールドやメモアプリなどでも使える様になります。どのキーを割り当てるかは<key> </key>内を編集すると好みに変更できます。

因みにXcode 4位まではPBKeyBinding.dictというファイルを~/Library/KeyBindings/に置くことで同じ様に手軽にキーバインディングを追加できた様なのですが、今はIDETextKeyBindingSet.plistを編集するしか手はない様です。

なぜアップルはこんな便利なものをもっと前面的に公開していないのか疑問ですね・・・