キー1つでGitHubで見ているリポジトリを即座にクローンしてターミナルで開く
ブラウザで GitHub のリポジトリを見ていて、ちょっとクローンして手許で確認してみたくなることってありますよね。
今回はこの作業はホット・キー1つで完了できるような設定をご紹介します。
下の動画ではブラウザで GitHub を閲覧時にAlt-P
を押下するだけで、git clone
してクローン先に移動した状態のターミナルに移動しています。
環境
ウィンドウ・マネージャ: Sway
ターミナル・エミュレータ: Wezterm
キー・リマッパ: xremap
OS: Arch Linux, Wayland
設定
キー・リマッパ
Google Chrome を使用中に Alt-P
を押下すると専用の Bash スクリプトを実行するように xremap を設定しています。[1]
keymap:
- application:
only: google-chrome
remap:
M-P:
launch: ["bash", "-c", "$XDG_CONFIG_HOME/xremap/scripts/clone-from-github.sh"]
git clone & ターミナルに移動
上記のキーで対応付けられているのが以下のスクリプトです。
#!/bin/bash -eu
MAIN_WEZTERM_PID=$(swaymsg -t get_tree | jq '.. | objects | select(.app_id? == "MainTerminal") | .pid')
export WEZTERM_UNIX_SOCKET=/run/user/$(id -u)/wezterm/gui-sock-$MAIN_WEZTERM_PID
wtype -M ctrl l -s 50 -k insert -k escape
user=$(wl-paste | sed -r "s@https://github\.com/([^/?]+).*@\1@")
repository=$(wl-paste | sed -r "s@https://github\.com/[^/]+/([^/?]+).*@\1@")
if [ -z "$user" ] || [ -z "$repository" ]; then
exit
fi
git clone git@github.com:$user/$repository ~/dev/$repository &
wezterm cli spawn --cwd ~/dev/$repository -- fish
swaymsg [app_id="^MainTerminal$"] focus
やっていることを大まかに説明するとこんな感じです。
- Ctrl-L + Ctrl-insert でブラウザの URL をクリップボードにコピー
- URL の情報からユーザ名とリポジトリ名が取得できなかったら
exit
- 所定の場所に
git clone
- クローン先をターミナルで開く
-
4
のターミナルにフォーカスを移動する (ここまではブラウザにフォーカスがある)
1
でブラウザから現在閲覧中の URL を取得する箇所だけ、OS にキーボードのタイプ情報を送信するという少々泥臭い手段を取っていますが、スマートな方法が無さそうなので仕方無いのかなと思います。
ターミナルを取得する場面でapp_id
がMainTerminal
のものを指定しています。これは、私が OS の起動時に Sway の以下の設定で起動させているターミナルに付けているものです。
exec wezterm start --class MainTerminal
また、Wezterm のプロセス外から Wezterm を操作するにはWEZTERM_UNIX_SOCKET
で Wezterm のインスタンスを指定する必要があります。[2] この値は環境に依るのではないかと思います。
export WEZTERM_UNIX_SOCKET=/run/user/$(id -u)/wezterm/gui-sock-$MAIN_WEZTERM_PID
おまけ ~ 今見ているページを Vim で開く ~
以下のスクリプトを特定のキーに設定しておくと vim {URL}
を実行して即座にソースが確認できます。
「このページ、ちょっと Vim で見たいんだよなぁ」となることが結構あるかと思いますが、そういった場面で重宝しています。
#!/bin/bash -eu
MAIN_WEZTERM_PID=$(swaymsg -t get_tree | jq '.. | objects | select(.app_id? == "MainTerminal") | .pid')
export WEZTERM_UNIX_SOCKET=/run/user/$(id -u)/wezterm/gui-sock-$MAIN_WEZTERM_PID
wtype -M ctrl l -s 50 -k insert -k escape
wezterm cli spawn -- vim $(wl-paste)
swaymsg [app_id="^MainTerminal$"] focus
以上です!
-
launch の部分が冗長に見えますが、環境変数がうまく展開されなかった為このような措置を取っています。 ↩︎
-
https://wezterm.org/cli/cli/
https://github.com/wezterm/wezterm/issues/4456 ↩︎
Discussion