iTermでFinderのフォルダを開きたい...!!

# iTermで現在開いているフォルダを開くぞ!
#### 【背景】
僕の同期が、
**Finderから1クリックで今のフォルダをターミナルにて開いている**
のを見て羨ましかったので。
彼はどうやらAppleScriptなるものを使用して実現しているようで、
アップル純正のAutoMatorというアプリで1クリックで"ターミナルを開く機能"を実現したらしい。

ターミナルでの方法は調べると[すぐに見つかった](https://daeudaeu.com/finder-terminal/#Automator_AppleScript)のですが、
同じコードをiTermで動かそうとしても動かなくて色々調べました。

#### とりあえず自分の環境で動作するか試したい方へ
後述するコードを丸コピした後に、本ページの下の方へスクロールして、**Automatorで設定する**まで読み飛ばしましょう。2分で終わります。

## 作成したコード
M1mac: ver13.3.1
iTerm2: 3.4.19
で動作しているのを確認しており、下のコードにPC固有のコードは入っていないはずなので、
これを**丸コピして動作しなければ、AppleScriptの書式が変更されているなどの原因が考えられる**ので、後で紹介する方法で自分で調べてみてね。(AppleScript歴5時間の奴が言ってることなので、信用しすぎないように!)
あと、ディレクトリのことを、「フォルダの場所」とか、「フォルダのパス」と表記していますので、悪しからず。

```applescript
on run {input, parameters}
	-- 1 ----------------------------------------------------------
	tell application "Finder"
		set hfsPath to insertion location as Unicode text
		set currentFolder to get POSIX path of hfsPath
	end tell
	-- 2 ----------------------------------------------------------
	set command to "cd \"" & currentFolder & "\" && clear"
	-- 3 ----------------------------------------------------------	
	tell application "iTerm"
		activate
		if current window = missing value then
			create window with default profile
		else
			tell current window
				create tab with default profile
			end tell
		end if
		set _current_session to current session of current tab of current window
		tell _current_session
			delay 1
			write text command
		end tell
	end tell
	------------------------------------------------------------
end run
```
というわけで、コメントで番号振っときましたので少し解説します。
#### 1. Finderで開いているフォルダの場所を取得する
```applescript
tell application "Finder"
-- 1'
    set hfsPath to insertion location as Unicode text
-- 2'
	set currentFolder to get POSIX path of hfsPath
end tell
```
まず、
```applescript
tell application "Finder"
    -- ○×△□ --
end tell
```
このように``tell``で囲まれた部分は、「Finderに対して**中に記述したコードを実行してね**」という意味かと。
そして、
```applescript
-- 1'
set hfsPath to insertion location as Unicode
```
これで、今開いているフォルダの場所を取得しているのだが、これはHFS形式という形式で、iTermやターミナルで使用できる形式ではないので、次の行
```applescript
-- 2'
set currentFolder to get POSIX path of hfsPath
```
で、使用できる形式に変換している。
___
#### 2. iTermで行いたい処理を書く(今回は手順1で取得したフォルダへ移動するコマンド)
``set 変数名 to 代入するもの``
で変数を設定できるので、今回は、
```applescript
set command to "cd \"" & currentFolder & "\" && clear"
-- (command = "cd " + currentFolder + " && clear" みたいなイメージ)
-- (command = "cd フォルダのパス && clear"が入る)
```
で、後で実行するコマンドを設定しておく。

また、
**iTermを開く→Finderで開いている位置に移動する**
という手順を踏んでプログラムを組みたいので、
```bash
cd 手順2で取得したフォルダの場所
```
を実行します。
実際のコードはこれに加えて、``&& clear``が記述されていますが、
これは、このプログラムを実行した際に、
![めも-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/71c22350-4016-fdae-d453-9fc1868a1395.jpeg)
このように実行したコードがモロに表示されるので、
せっかくプログラム作ったのに、『こんなコード打ちましたよ〜』って表示されるのはなんか嫌だと思い、``&& clear``を追加して、実行時に初めからFinderの場所が開かれたように見えるようにしました。(なので、ここは消してもらっても構いません)
___
#### 3. iTermを起動し、手順2で設定した処理を実行する
```applescript
-- 3 ----------------------------------------------------------	
tell application "iTerm"
	activate
	if current window = missing value then
		create window with default profile
	else
		tell current window
			create tab with default profile
		end tell
	end if
-------------------------------------------------------------
	set _current_session to current session of current tab of current window
	tell _current_session
		write text command
	end tell
end tell
```
手順1でのtellの説明でも書きましたが、
``tell application "iTerm"``で囲んだ部分で、
「**iTermに対して中に記述したコードを実行してね**」とPCに教えています。
そして``active``と2行目で書いていますが、これは**iTermを起動する**という意味のコードです。
ただ、**これは起動するだけ**のようなので、iTermが開かれていない場合、ウィンドウが作成されず**何も始まりません**。

↓これがウィンドウね
![これがウィンドウ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/3eb08a5f-2012-b5eb-b6de-8a844808819d.png)
(開かれている場合は、ウィンドウが最前面に出てくるだけ)
___
なので、
* ウィンドウが開かれていない場合、新たにウィンドウを作成
* 既に開かれている場合は、**アクティブになったウィンドウで**新たにタブを作成
↓これがタブね
![これがタブね](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/99e562dd-31ff-d05a-4e0d-8a31e3aae7ed.png)
という処理を行います。
どうして「アクティブなウィンドウで」と強調したのかというと、僕が、
``create tab with default profile``
を実行していた際に、
```applescript
tell current window
    create tab with default profile
end tell
--　これが正解
```
を``tell current window``で囲んでいなくてタブが生成されず、
ずっと「タブが生成されないなぁ？」と困ったからです。
PC側からすると、どのウィンドウでタブを作成するのか分からないから当たり前と言えばそうなのですがね、、

そして、
```applescript
-- setは変数を宣言するコード
set _current_session to current session of current tab of current window
-- _current_session = current window.current tab.current session みたいなイメージ
```
ウィンドウの中のタブの中のセッションというものを変数にセットする。
最後に、
```applescript
tell _current_session
	delay 1
	write text command
end tell
```
``tell _current_session``で囲まれた部分で、
「**_current_sessionに対して、中に記述したコードを実行してね**」とPCに教えます。

``delay 1``でウィンドウやタブ作成後少し待ってあげて、
``write text 〇〇``
の〇〇にiTermで実行したいコマンド(今回は**手順2の変数"comand"にて宣言しておいたコード**)を記述して終わりです。

## Automatorで設定する
「以上のコードをどうやって使うねん」って話ですが、
皆さんのMacからAutomatorというアプリを開いてください。(純正なので勝手に入ってます)
![おーとまた](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/f1777e6d-b931-381f-917f-af610d6c6d56.png)
「見つからん」って方は、
**command⌘ボタンを押しながらスペースを押す**と、Macの何でも検索欄が出てくるので、Automatorと検索してみるといいかもね。
![automator1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/d29e22bc-661c-ce38-b427-54a8e0f6289b.png)

↑こんな感じでアプリケーションという項目を選択し、
___
![applescript_do](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/e2f46ffa-1e65-acc6-bd53-c629c340d132.png)
↑「AppleScriptを実行」をタブルクリックする。
___

![codewrite](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/e50d230b-93fb-88f9-54eb-bfe8409fc823.png)

↑すると、コードが書けそうな欄が出てくるので、
さっきのコードをコピペします。
___
![donescript](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/c996279e-3818-424c-c817-b2dbfe837801.png)
↑
【動作確認】
実行ボタンを押したり、トンカチのボタンを押すと、コードに色がついたりします。
成功すれば、iTermが開かれて、新しくタブ又はウィンドウが生成されます。
____
![savescript](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/29cf699a-5031-141a-7926-4e851d867738.png)
↑お好きな名前でお好きな場所へ保存します。
フォーマットはアプリケーションのままです。
僕はアプリケーションフォルダに保存しました。
 ___

![IMG_0999.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/68601894-d28a-aee7-dfad-d1a0ae54d148.jpeg)

Finderで保存した場所を開き、**コマンドボタンを押しながら、タブバーと呼ばれる上の縁にドラッグ&ドロップする**と、そこにボタンが作られるので、完成です。お疲れ様です。

## アイコンを変えてみる
![propaty](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/eeae33e9-4511-60e5-89a9-dd141d373eb7.png)
↑右クリックで「情報を見る」を選択する。
___
![drop](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/b0196da8-4649-2418-e6c7-5df27d17760c.jpeg)
↑小さなアイコンにドラッグ＆ドロップする。
![changed](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/0a79c153-e1e9-51dc-13c7-a72c7becbbe6.png)
アイコンが変わった。お可愛いですね。
## AppleScriptの資料
![スクリーンショット 2023-05-25 19.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/2b5ad7f8-6c92-4d07-fecc-0ae910c616e7.png)
これを開きます。(純正なので勝手に入ってます)
![スクリーンショット 2023-05-25 19.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/5bd5cc52-3610-259b-3a33-ec4703e7a9ec.png)
ファイルの新規作成とはせずに、画面上部から
ウィンドウ→ライブラリと進む。
![スクリーンショット 2023-05-25 19.21.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/ce08d300-47bc-d10b-3243-c6bf41941c3a.png)
ライブラリが表示されるので、"iTerm"を探す。
多分ないので、+(プラス)ボタンを押して、
![スクリーンショット 2023-05-25 19.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/11249a11-4655-32f2-efe9-974d8e07c9f1.png)
アプリケーションからiTermを追加する。

追加したことによって現れたiTermを開くと、英語ですが資料が見れます。
TabとかWindowとかのキーワードだけでも探せば少しは分かります。
![スクリーンショット 2023-05-25 19.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375163/86b191c3-5eb9-32a1-2b30-f1f70ae7af89.png)



## 最後に
以下が参考になったページです。
【参考URL】
* ハイパーマッスルエンジニア
    * [iTermをAppleScriptで操作する](https://www.rasukarusan.com/entry/2019/04/06/224538)
* だえうホームページ
    * [【Mac】Finderから現在フォルダをターミナルで開く](https://daeudaeu.com/finder-terminal/#Automator_AppleScript)