iPhone

Xcodeでカスタムのショートカットを作る!

xcode-custom-shortcut

Xcodeでカスタムのショートカットを作る!

今日はiOSDC2021 Day2です。 昨日のセッションのデモを見てて、Xcodeのショートカットを使うと便利そうと思った場面があったので、そのテーマについて、久々に#iwillblogをしようと思いました笑

Xcodeのカスタムのショートカットとは?

Xcodeの標準のショートカットではできない設定をすることができます。
例えば自分はXcode以外にもVisual Studio Codeを使っているのですが、
そのVSCode で使っているショートカット、例えばカーソルが当たっている行をコピーしたり、
指定行のコードを上下に移動したりなどをXcodeで使えるようにすることができます。
以下のGifはそのショートカットを実際に使用しているときのものです(画質悪くて、ごめんなさい。。🙇‍♂️)
xcode-custom-shortcut-0

Xcodeでカスタムのショートカットを作るには?

Xcodeのショートカットについては、Xcodeの設定のKey Bindingsから確認できます。
xcode-custom-shortcut-1
しかしカスタムのショートカットを追加するためには、IDETextKeyBindingSet.plistというファイルを編集する必要があります。
このファイルは、/"Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist"に格納されています。

このファイルを開いて、以下のように追記してみましょう!

 

<key>Original Direction</key>
<dict>
	<key>Duplicate Current Line Original</key>
	<string>moveToBeginningOfLine:, deleteToEndO
fLine:, yank:, insertNewline:, moveToBeginningOfLine:, yank:</string>
	<key>Move Line Up Original</key>
	<string>selectParagraph:, cut:, moveBackward:, moveToBeginningOfParagraph:, paste:, moveBackward:, moveToBeginningOfParagraph:</string>
	<key>Move Line Down Original</key>
	<string>selectParagraph:, cut:, moveToEndOfParagraph:, moveRight:, paste:, moveBackward:, moveToBeginningOfParagraph:</string>
	<key>Continue Newline Original</key>
	<string>moveToEndOfLine:, insertNewline:</string>
</dict>

ここでは4つのカスタムのショートカットを登録しています。
①Duplicate Current Line Original
これは上記で述べたカーソルが当たっている1行のコードをその下の行にコピーするショートカットです
②Move Line Up Original
これはカーソルが当たっている1行のコードをその上の行に移動させるためのショートカットです。
③Move Line Down Original
これは②の下に移動させるバージョンです。
④Continue Newline Original
これは行のコードの途中にカーソルが当たっていても、行末でエンターを押したときのように、新しい行へ改行するショートカットです。

追記したコードの <string>の箇所には、そのショートカットを実行した時にどのような処理を実行するかを順番に書いています。
ここをカスタマイズすることで、オリジナルのショートカットを作成することができます。
なお自分が使っているファイル全文は以下から確認可能です。

Xcodeで実際にショートカットキーを割り当てる

上記のIDETextKeyBindingSet.plistの編集が完了したら、一度Xcodeを再起動しましょう。 そしてXcodeの設定画面のKey Bindingsを開くと、先ほど設定した項目が表示されるはずです。

xcode-custom-shortcut-2

あとは各ショートカットに、ショートカットキーを割り当てるだけです。
上記のスクショを見ればわかる通り(少し画質が悪いかもです。。)、自分の場合は、
VSCodeと同じように使えるように以下のように設定しています。

①Duplicate Current Line Original → shift + option + ↓
②Move Line Up Original → option + ↑
③Move Line Down Original → option + ↓
④Continue Newline Original → command + Enter

ここでXcodeの設定によっては、ショートカットキーの横に⚠️が表示されるかもしれません(上記のスクショにも少し映ってますね)。
これはショートカットキーが他のショートカットとコンフリクトしているためです。
これを解消するには、今回設定したショートカットに別のショートカットキーを割り当てるか、
コンフリクトしている別のショートカットに別のショートカットキーを割り当てるかのどちらかです。
自分の場合は、コンフリクトしている別のショートカットは日頃使わないものだったので、それらに適当なショートカットを割り当てて、コンフリクトを解消しました!

これであなたが作成したショートカットをXcodeで使えるようになります🎉

新しいバージョンのXcodeをダウンロードした時

上記で設定したショートカットは新しくダウンロードしたXcodeではそのまま使用できないので、同じく再設定する必要があります。
しかし毎回Xcodeのフォルダーの奥にある該当ファイルをコピーするのは大変です。
そこで自分は該当ファイルを指定のバージョンのXcodeにコピーするスクリプトを作成し、それを毎回使っています。

## Specify the xcode version and replace the KeyBindingFile with a custom one ($ 1: Xcode version, $ 2: IDETextKeyBindingSet.plist path)
function replaceKeybindingFile() {
  # null check of arg1
  if [ ! -n "$1" ]; then
    echo "arg1(xcode version number) is required!"; return
  fi
  # Numerical judgment of arg1
  expr "$1 + 1" > /dev/null 2>&1
  if [ ! $? -lt 2 ]; then
    echo arg1 must be xcode version number!; return
  fi
  #Determining if the arg1 version of Xcode is in the application folder
  XcodePath=/Applications/Xcode$1.app
  if [ ! -e $XcodePath ]; then
    echo Xcode$1.app does not exist in Applications directory!; return
  fi
  KeyBindingFilePath=""
  PrivateKeyBindingFilePath=$HOME/SettingFiles/Xcode/XcodekeyBinding/IDETextKeyBindingSet.plist
  if [ -n "$2" ] && [ -e $2 ] && [ `basename $2` = IDETextKeyBindingSet.plist ]; then
      KeyBindingFilePath=$2
  elif [ -e $PrivateKeyBindingFilePath ]; then
    KeyBindingFilePath=$PrivateKeyBindingFilePath
    echo Default file: $HOME/SettingFiles/Xcode/XcodekeyBinding/IDETextKeyBindingSet.plist will be used!
  else
    echo "arg2(`$KeyBindingFilePath`) is invalid!"; return
  fi
  XcodeKeyBindingFilePath="/Applications/Xcode$1.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist"
  cp -f $KeyBindingFilePath $XcodeKeyBindingFilePath
  echo "keybinding file of Xcode$1.app was replaced!"
}

これは以下のように実行できます。
replaceKeybindingFile Xcode13 "/Applications/Xcode12.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/IDETextKeyBindingSet.plist"
これでXcode12のショートカット設定をXcode13でも使用できるようになります。
自分の場合は、IDETextKeyBindingSet.plistをGit管理していて、
指定のディレクトリに格納してあるので、上記のコマンドでファイルのパスを指定しない場合は
そのファイルをパスをデフォルトで設定するようにしているので、
replaceKeybindingFile Xcode13のように実行できます。
あとは同じくXcodeでショートカットキーを割り当てるだけです(これを毎回やらないといけないのは、地味にめんどくさい。。。)

なお上記のスクリプトは以前記事にしたMacの環境構築を自動化するリポジトリに入っているので、Macの初期設定が完了したらすぐに使用できるようにしています。

まとめ

今回はXcodeでカスタムのショートカットを設定する方法をまとめました!
この設定をした後はXcodeでのよりスピード感をもって開発ができるようになりました🎉
自分の場合は、Xcodeを使用する前にVSCodeでの開発を行なっていたので、VSCodeのショートカットを使用できなくて、かなりストレスを感じていたので、この設定後はVSCode / Xcodeで共通のショートカットが使えて、便利かつ、わかりやすくなりました!
この設定をしてから、このショートカットを使わない日はないです笑

もし皆さんが使っている、もしくは新しく作った便利なショートカットがあれば、教えていただけると嬉しいです!

iOSDCも最終日ですが、最後まで楽しみましょう!
アーカイブみたりすると、実質来週いっぱいくらいはiOSDCのキャッチアップの期間になりそうです笑

0

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA