iTermで現在開いているフォルダを開くぞ!
【背景】
僕の同期が、
Finderから1クリックで今のフォルダをターミナルにて開いている
のを見て羨ましかったので。
彼はどうやらAppleScriptなるものを使用して実現しているようで、
アップル純正のAutoMatorというアプリで1クリックで"ターミナルを開く機能"を実現したらしい。
ターミナルでの方法は調べるとすぐに見つかったのですが、
同じコードをiTermで動かそうとしても動かなくて色々調べました。
とりあえず自分の環境で動作するか試したい方へ
後述するコードを丸コピした後に、本ページの下の方へスクロールして、Automatorで設定するまで読み飛ばしましょう。2分で終わります。
作成したコード
M1mac: ver13.3.1
iTerm2: 3.4.19
で動作しているのを確認しており、下のコードにPC固有のコードは入っていないはずなので、
これを丸コピして動作しなければ、AppleScriptの書式が変更されているなどの原因が考えられるので、後で紹介する方法で自分で調べてみてね。(AppleScript歴5時間の奴が言ってることなので、信用しすぎないように!)
あと、ディレクトリのことを、「フォルダの場所」とか、「フォルダのパス」と表記していますので、悪しからず。
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で開いているフォルダの場所を取得する
tell application "Finder"
-- 1'
set hfsPath to insertion location as Unicode text
-- 2'
set currentFolder to get POSIX path of hfsPath
end tell
まず、
tell application "Finder"
-- ○×△□ --
end tell
このようにtell
で囲まれた部分は、「Finderに対して中に記述したコードを実行してね」という意味かと。
そして、
-- 1'
set hfsPath to insertion location as Unicode
これで、今開いているフォルダの場所を取得しているのだが、これはHFS形式という形式で、iTermやターミナルで使用できる形式ではないので、次の行
-- 2'
set currentFolder to get POSIX path of hfsPath
で、使用できる形式に変換している。
2. iTermで行いたい処理を書く(今回は手順1で取得したフォルダへ移動するコマンド)
set 変数名 to 代入するもの
で変数を設定できるので、今回は、
set command to "cd \"" & currentFolder & "\" && clear"
-- (command = "cd " + currentFolder + " && clear" みたいなイメージ)
-- (command = "cd フォルダのパス && clear"が入る)
で、後で実行するコマンドを設定しておく。
また、
iTermを開く→Finderで開いている位置に移動する
という手順を踏んでプログラムを組みたいので、
cd 手順2で取得したフォルダの場所
を実行します。
実際のコードはこれに加えて、&& clear
が記述されていますが、
これは、このプログラムを実行した際に、
このように実行したコードがモロに表示されるので、
せっかくプログラム作ったのに、『こんなコード打ちましたよ〜』って表示されるのはなんか嫌だと思い、&& clear
を追加して、実行時に初めからFinderの場所が開かれたように見えるようにしました。(なので、ここは消してもらっても構いません)
3. iTermを起動し、手順2で設定した処理を実行する
-- 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が開かれていない場合、ウィンドウが作成されず何も始まりません。
↓これがウィンドウね
(開かれている場合は、ウィンドウが最前面に出てくるだけ)
なので、
- ウィンドウが開かれていない場合、新たにウィンドウを作成
- 既に開かれている場合は、アクティブになったウィンドウで新たにタブを作成
↓これがタブね
という処理を行います。
どうして「アクティブなウィンドウで」と強調したのかというと、僕が、
create tab with default profile
を実行していた際に、
tell current window
create tab with default profile
end tell
-- これが正解
をtell current window
で囲んでいなくてタブが生成されず、
ずっと「タブが生成されないなぁ?」と困ったからです。
PC側からすると、どのウィンドウでタブを作成するのか分からないから当たり前と言えばそうなのですがね、、
そして、
-- setは変数を宣言するコード
set _current_session to current session of current tab of current window
-- _current_session = current window.current tab.current session みたいなイメージ
ウィンドウの中のタブの中のセッションというものを変数にセットする。
最後に、
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というアプリを開いてください。(純正なので勝手に入ってます)
「見つからん」って方は、
command⌘ボタンを押しながらスペースを押すと、Macの何でも検索欄が出てくるので、Automatorと検索してみるといいかもね。
↑こんな感じでアプリケーションという項目を選択し、
↑すると、コードが書けそうな欄が出てくるので、
さっきのコードをコピペします。
↑
【動作確認】
実行ボタンを押したり、トンカチのボタンを押すと、コードに色がついたりします。
成功すれば、iTermが開かれて、新しくタブ又はウィンドウが生成されます。
↑お好きな名前でお好きな場所へ保存します。
フォーマットはアプリケーションのままです。
僕はアプリケーションフォルダに保存しました。
Finderで保存した場所を開き、コマンドボタンを押しながら、タブバーと呼ばれる上の縁にドラッグ&ドロップすると、そこにボタンが作られるので、完成です。お疲れ様です。
アイコンを変えてみる
↑小さなアイコンにドラッグ&ドロップする。
アイコンが変わった。お可愛いですね。
AppleScriptの資料
これを開きます。(純正なので勝手に入ってます)
ファイルの新規作成とはせずに、画面上部から
ウィンドウ→ライブラリと進む。
ライブラリが表示されるので、"iTerm"を探す。
多分ないので、+(プラス)ボタンを押して、
アプリケーションからiTermを追加する。
追加したことによって現れたiTermを開くと、英語ですが資料が見れます。
TabとかWindowとかのキーワードだけでも探せば少しは分かります。
最後に
以下が参考になったページです。
【参考URL】
- ハイパーマッスルエンジニア
- だえうホームページ