こんにちは、エンジニアのオオバです。
Windowsには、エクスプローラーの右クリックから「新規作成 > テキスト ドキュメント」で空のファイルを作る機能があります。
Macで地味に困るのが、この操作です。
Finderには、今開いているフォルダに空のファイルを作るボタンがありません。
ターミナルを開いて touch するか、エディタで保存先を選び直すか。
毎回ちょっとだけ面倒なんですよね。
そこでFinderのツールバーに「新規テキスト/Markdown」ボタンを自分で足してみました。
しかも Xcodeのプロジェクトは作らず、swiftc だけでビルドしています。
Finder Sync拡張をswiftcで直ビルドして実現
完成したのが、こちらのボタンです。
ツールバーのボタンを押すとドロップダウンが開き、「新規テキストファイル (.txt)」と「新規Markdownファイル (.md)」を選べます。
選ぶと、今開いているフォルダにファイルができる仕組み。
作業時間は30分ほどでした。
Claude Code Opus5.5を利用しています。コードを書かせた場合は今のところ一番バランスが良いですね。
- Finder Sync拡張(FIFinderSync)でツールバーと右クリックにメニューを出す
- Xcodeプロジェクトなしでswiftcから.appexを組む
- ad-hoc署名のままpluginkitで有効化する
やりたかったこと
やりたかったことは1つだけです。
Finderで今開いているフォルダに、新規の .txt / .md をワンクリックで作る。
「このフォルダにmdを1枚置きたい」と思うたびに、エディタを開いて保存先のフォルダを探して…という手間を消したかったんです。
もう1つのこだわりが、Xcodeを開かないこと。
小さな道具のためにXcodeのプロジェクトを作り、設定画面をあちこち触るのは、正直おっくうでした。
ファイル数本とコマンドだけで完結するなら、そのほうが後から見返しても分かりやすいと思っています。
Finder Sync拡張でツールバーにボタンを出す
Finderにボタンやメニューを足すには、Finder Sync拡張(FIFinderSync)を使います。
ツールバーのボタンは、次の3つで決まります。
toolbarItemName: ボタンの名前toolbarItemImage: ボタンのアイコンmenu(for: .toolbarItemMenu): ボタンを押したときに出すメニュー
menu(for:) で返したメニューが、そのままボタンのドロップダウンになります。
あわせて .contextualMenuForContainer にも同じメニューを返すようにしました。
これでフォルダの空いている場所を右クリックしても、同じ項目からファイルを作れます。
ツールバーと右クリックの両方から使えるのは、地味にうれしいポイントです。
作成先のフォルダとファイル名の決め方
ファイルを作る先は FIFinderSyncController.default().targetedURL() で取ります。
Finderで今見ているフォルダのURLが返ってきます。
ここで1つ注意があります。
Finder Sync拡張は、監視対象として登録したフォルダの中でしか働きません。
どのフォルダでも使いたかったので、directoryURLs = ["/"] としてルートから全部を対象にしました。
ファイル名は「名称未設定.md」のような固定の名前です。
同じ名前のファイルがすでにあれば「名称未設定 2.md」のように連番を振ります。
作ったあとは NSWorkspace.activateFileViewerSelecting で、そのファイルを選択状態にしています。
選択された状態なら、そのまま Enter を押してすぐ名前を変えられます。
Finderの「新規フォルダ」と同じ感覚で使えるようにしたかったので、ここは外せませんでした。
Xcodeを使わずswiftcで.appexを組む
ここからが今回いちばん試したかったところです。
Xcodeのプロジェクトは作らず、swiftc で直接ビルドしました。
そもそもswiftcとは?
swiftc は、Swiftのソースコードをコンパイルするコマンドラインのツールです。
Xcodeでビルドボタンを押したときも、裏ではこの swiftc が呼ばれています。
Xcode(またはCommand Line Tools)が入っていれば、ターミナルからそのまま使えます。
つまり Xcodeの画面を開かなくても、swiftc に必要なオプションを渡せばアプリや拡張のバイナリは作れるわけです。
拡張のビルドで付けた2つのオプション
拡張側のビルドでは、次の2つを付けています。
-parse-as-library-Xlinker -e -Xlinker _NSExtensionMain
普通のSwiftのコマンドラインツールは、main.swift に書いた処理、いわゆる「main関数」からプログラムが始まります。
一方、App Extensionでは自分でmain関数を書きません。
起動するとまずFoundationの _NSExtensionMain が動き、Info.plistで指定したクラス(今回は FIFinderSync のサブクラス)を呼び出す仕組みです。
2つのオプションは、この起動の流れに合わせるためのものです。
-parse-as-library: ソースをライブラリとして扱い、Swift側にmain関数を作らせない-Xlinker -e -Xlinker _NSExtensionMain: プログラムの開始位置(エントリポイント)を_NSExtensionMainにするよう、リンカへ伝える
ビルドしたバイナリは、.appex のバンドルに手で詰めました。
Xcodeが裏でやっている「フォルダを作ってInfo.plistとバイナリを置く」作業を、自分でやるイメージです。
サンドボックスで任意のフォルダに書き込む
Finder Sync拡張は サンドボックスが必須 です。
サンドボックスの中からは、基本的に好きな場所へファイルを書き込めません。
これでは、今開いているフォルダにファイルを作るという目的が果たせません。
そこでentitlementsに com.apple.security.temporary-exception.files.absolute-path.read-write を足し、値に "/" を指定しました。
これで任意のフォルダへ書き込めるようになります。
名前のとおり「一時的な例外」の扱いなので、App Storeで配る道具には向きません。
今回は自分のMacで使うだけなので、割り切ってこの設定にしています。
開発者証明書なしでも有効化できた
署名は開発者証明書を使わず、codesign -s - のad-hoc署名で済ませました。
「さすがに証明書なしだと拡張は読み込まれないかな?」と思っていたんですよね。
試してみると、pluginkit -a で登録し、pluginkit -e use で有効化するだけで、macOS 15.4で普通に動きました。
もう1つうれしかったのが、ツールバーへの追加です。
初回の登録で、Finderのツールバーにボタンが自動で追加されていました。
Finderの設定(com.apple.finder の NSToolbar Configuration Browser)に入っていたので、ツールバーのカスタマイズ画面を開く必要もありません。
登録したらすぐ使える状態になるのは、正直ありがたかったです。
まとめ
Finderで今開いているフォルダに、.txt と .md をワンクリックで作れるようにしました。
- FIFinderSyncでツールバーと右クリックに同じメニューを出した
- targetedURLで作成先を取り、directoryURLsは「/」にした
- 同名があれば連番にし、作成後は選択状態にしてすぐリネームできるようにした
- swiftcに-parse-as-libraryと_NSExtensionMainを渡して.appexを手で組んだ
- ad-hoc署名とpluginkitだけでmacOS 15.4で動いた
Xcodeを開かなくても、Finder拡張は作れます。
必要なのはソースとInfo.plist、entitlements、そしてビルドのコマンドだけ。
小さな不便を自分の道具で消せると、毎日の作業が少し軽くなります。
Macで同じところに引っかかっていた方は、ぜひ試してみてください。

筆者のXをフォローしよう
- macOS 15.4.1 / Xcode 16.2 (swiftcのみ)






