今回はMacで選択したファイル・フォルダのファイルパスをショートカットキーで取得・クリップボードにコピーする方法について解説します。使用している技術はサービスとJXA(JavaScript for Automation)です。
またファイルパスを取得する際、文字列内のユーザー名などを置換する方法についても合わせて述べます。技術ブログなどを書いている方には便利かもしれません。
環境
- OS X 10.11.6
経緯
ブログを書く際や業務において、この階層に◯◯というファイルを置いて…と説明する場面、ありませんか?
ぼくは結構あるので、こんなツールを作りました。
- ファイルやフォルダを選択
- コンテクストメニューまたはショートカットキー
cmd+shift+X
からツールを実行 - クリップボードにパスがコピーされてる!
動画で見ると分かりやすいですね。
まず、一般的方法を確認し、それを改善する方向でツールの仕様を決めていきましょう。
一般的な方法
ファイルを選択して、
- コンテキストメニューから「情報を見る」を実行
- command + I
上記を実行すると情報ウィンドウが表示されるので場所をドラッグで選択、コピーするとこんな感じになります。
/Users/*********/Desktop/slide
悪くはないのですが*********
の部分に自分のコンピュータのユーザー名が表示されてしまうのが微妙ですね。記事を書く際は手作業で修正することになるでしょう。しかも目標だった3dmu.html
は入っておらず、上記パスに付け加えなければいけません。
~/Desktop/slide/3dmu.html
はじめからこんな感じでコピーしてくれるとうれしいですね。
これらをふまえてツールの仕様を考えてみましょう。
仕様
- ショートカットキーで実行できるものとする
- コピーしたファイルパスを自動的に置換する
今回は上記を満たす技術として、Macのサービスを使うこととしましょう!
ツールを作成する
サービスの作成
Automatorを起動して新規サービスを作成します。
作り方は下記動画の通りです。検索窓で絞り込みを行ったり、使用回数でソートしたりしながらアクションを選択して上から下に向かって処理をつなげていきます。
今回はこのようになりました。
- Finderから選択した「ファイルまたはフォルダ」を受け取ります。
- JavaScriptを実行します。
- JavaScriptの戻り値を受取りクリップボードにコピーします。
こんな感じです。サービはcpp
という名前で保存しました。
次は本記事のメイン、JXA*1コード解説です。
JXAのコード解説
1行目(から5行目)
function run(input, parameters) { ... }
run関数
が実行されます。引数としてinput
とparameters
が渡ってくるので、処理内で利用したい場合は使っていきましょう。
今回はinput
にFinderから渡されたファイルオブジェクトまたはフォルダオブジェクトが入っています。
2行目
var sys = Application("System Events");
システムイベントオブジェクトを取得し、変数sys
に格納します。
3行目
var user_name = sys.currentUser().name();
システムイベントオブジェクトのユーザーオブジェクトはcurrentUser()メソッド
で取得できます。
そして取得したユーザーオブジェクトに対してさらにname()メソッド
を使用することでユーザー名を取得しています。
4行目
return input.toString().replace("/Users/" + user_name, "~");
ちょっとだけ長いですが難しくないので読んでいきましょう。
input.toString()
でFinderから渡ってきたファイルオブジェクト・フォルダオブジェクトの文字列表現を取得します。
例として/Users/*********/Desktop/slide/index.html
みたいなのが取得できます。(加工前のパスです)
そしてその生の文字列に対してreplace
メソッドで置き換えを行っています。先程の例だと
変換前 | 変換後 |
---|---|
/Users/*********/ | ~ |
こんな感じになります。つまり最終的に下記状態になるわけです。
- input :
/Users/*********/Desktop/slide/index.html
- output :
~/Desktop/slide/index.html
サービスにショートカットを割り当てる
- システム環境設定を起動する
- キーボードをクリック
- ショートカットタブをクリック
- サービスをクリック
- ファイルとフォルダ内に
cpp
があるので「ショートカット追加ボタン」を押す
まとめ
いかがでしょうか。Macにデフォルトで入っているAutomatorを使うと、自作のショートカットが設定できることがわかりました。
みなさんもお好みのスクリプトをショートカットに割り当てて、作業効率化をはかってください。
備考
本記事は以前Qiitaに投稿したものをJXAバージョンにリライトしたものになります。前回はシェルスクリプトで書いていたのと、ユーザー名を直値で置き換えていたので今回の記事のほうが汎用性が高いかと思います。
参考までに下記にリンクを置いておきます。
[ Mac ] サービスを利用してファイルのパスをコピー・文字列置換する - Qiita
*1:MacのOS X Yosemite(10.10)から使用できるようになった機能で、OSレベルの自動化をJavaScriptで行うことができるというものです