kick the base

Houdiniと、CG技術と、日々のこと。

Mac/JXA: 選択したファイル・フォルダのパスをショートカットキーで取得する

今回はMacで選択したファイル・フォルダのファイルパスをショートカットキーで取得・クリップボードにコピーする方法について解説します。使用している技術はサービスとJXA(JavaScript for Automation)です。

またファイルパスを取得する際、文字列内のユーザー名などを置換する方法についても合わせて述べます。技術ブログなどを書いている方には便利かもしれません。

環境

  • OS X 10.11.6

経緯

ブログを書く際や業務において、この階層に◯◯というファイルを置いて…と説明する場面、ありませんか?

ぼくは結構あるので、こんなツールを作りました。

  1. ファイルやフォルダを選択
  2. コンテクストメニューまたはショートカットキーcmd+shift+Xからツールを実行
  3. クリップボードにパスがコピーされてる!

動画で見ると分かりやすいですね。

f:id:kickbase:20161014005828g:plain

まず、一般的方法を確認し、それを改善する方向でツールの仕様を決めていきましょう。

一般的な方法

ファイルを選択して、

  • コンテキストメニューから「情報を見る」を実行
  • command + I

上記を実行すると情報ウィンドウが表示されるので場所をドラッグで選択、コピーするとこんな感じになります。

/Users/*********/Desktop/slide

f:id:kickbase:20161019040224j:plain

悪くはないのですが*********の部分に自分のコンピュータのユーザー名が表示されてしまうのが微妙ですね。記事を書く際は手作業で修正することになるでしょう。しかも目標だった3dmu.htmlは入っておらず、上記パスに付け加えなければいけません。

~/Desktop/slide/3dmu.html

はじめからこんな感じでコピーしてくれるとうれしいですね。

これらをふまえてツールの仕様を考えてみましょう。

仕様

  • ショートカットキーで実行できるものとする
  • コピーしたファイルパスを自動的に置換する

今回は上記を満たす技術として、Macのサービスを使うこととしましょう!

ツールを作成する

サービスの作成

Automatorを起動して新規サービスを作成します。

作り方は下記動画の通りです。検索窓で絞り込みを行ったり、使用回数でソートしたりしながらアクションを選択して上から下に向かって処理をつなげていきます。

f:id:kickbase:20161014005827g:plain

今回はこのようになりました。

  1. Finderから選択した「ファイルまたはフォルダ」を受け取ります。
  2. JavaScriptを実行します。
  3. JavaScriptの戻り値を受取りクリップボードにコピーします。

f:id:kickbase:20161014011512j:plain

こんな感じです。サービはcppという名前で保存しました。

次は本記事のメイン、JXA*1コード解説です。

JXAのコード解説

1行目(から5行目)

function run(input, parameters) { ... }

run関数が実行されます。引数としてinputparametersが渡ってくるので、処理内で利用したい場合は使っていきましょう。

今回は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/*********/ ~

こんな感じになります。つまり最終的に下記状態になるわけです。

  1. input : /Users/*********/Desktop/slide/index.html
  2. output : ~/Desktop/slide/index.html

サービスにショートカットを割り当てる

  1. システム環境設定を起動する
  2. キーボードをクリック
  3. ショートカットタブをクリック
  4. サービスをクリック
  5. ファイルとフォルダ内にcppがあるので「ショートカット追加ボタン」を押す

f:id:kickbase:20161014005831j:plain

まとめ

いかがでしょうか。Macにデフォルトで入っているAutomatorを使うと、自作のショートカットが設定できることがわかりました。

みなさんもお好みのスクリプトをショートカットに割り当てて、作業効率化をはかってください。

備考

本記事は以前Qiitaに投稿したものをJXAバージョンにリライトしたものになります。前回はシェルスクリプトで書いていたのと、ユーザー名を直値で置き換えていたので今回の記事のほうが汎用性が高いかと思います。

参考までに下記にリンクを置いておきます。

[ Mac ] サービスを利用してファイルのパスをコピー・文字列置換する - Qiita

*1:MacのOS X Yosemite(10.10)から使用できるようになった機能で、OSレベルの自動化をJavaScriptで行うことができるというものです