1. 記事一覧 >
  2. ブログ記事
Windows
category logo

AutoHotkeyを使って、Open Git Bash hereのキーボードショートカットを作成

(更新) (公開)

はじめに

突然ですが、みなさん、"Open Git Bash here" を活用されていますでしょうか?


Git for Windows をインストールすると、Linux コンソールのような Git Bash がおまけでインストールされます。
これがものすごく便利です。Windows 標準で欲しいくらいです。


例えば、「あれ、どの設定ファイルに書いてあったっけ?」とかなったときに、
設定ファイルが含まれているフォルダをエクスプローラーで開いておいて、
右クリックメニューで、"Open Git Bash here" を選択して、
$ grep -r "hogehogesettei" settings/
のように grep で探せます。他にも findvi 等々いろいろあります。Windows のまま Unix 脳が活用できるというものです。


しかし...
Windows 11 になったとき、右クリックその他のオプションを確認Open Git Bash here の操作が必要になりました。
無慈悲にも その他のオプションを確認 の操作が追加されてしまったのです。
その他のオプションを確認


Windows 11 22H2 からは、SHIFT + 右クリックで、従来のメニューが表示されるようになったため、1ステップですが、SHIFT を押すのが若干面倒です。
SHIFT を押し忘れたり、タイミングが遅かったりすると、当然、Open Git Bash here が表示されないメニューが開きます。
SHIFT + 右クリック


今回、この不満を解消し、AutoHotkey を使って、CTRL + Space だけで Open Git Bash here が起動するようにしましたので、その全手順を紹介していきたいと思います。

CTRL + Spaceだけで Open Git Bash here が起動


【検証環境】

Windows 11 PRO x64 23H2

Windows 11 PRO x64 22H2

Windows 10 PRO x64 22H2

Windows 10 PRO x64 20H2

Git-2.42.0.2-64-bit

AutoHotkey_2.0.10(v1.1.37.01)

AutoHotkey 専用のスクリプト言語(AHK)を記述します。内容次第で、CTRL + Space 以外にもできます。(例:CTRL + ALT + T)また、AutoHotkey のスクリプト内容次第で他の用途にも使用できます。

AutoHotkey v2 移行期でプログラムの後方互換性が無いようですが、2023 年 11 月現在、v2 のサンプルが少ないため、v1 で進めます。


Git Bash インストール

Git for Windows をダウンロードしてインストールします。
https://git-scm.com/download/win

Git for Windows


今回は、ダウンロードしたのは、Git-2.42.0.2-64-bit.exe です。
ダブルクリックしてインストールします。


今回、全てデフォルトの選択で進めたものとします。

全てデフォルトの選択


このチェックボックスの選択を含め、何も変更していません。


AutoHotkey インストール

AutoHotkey v2.0.10 をダウンロードしてインストールします。
https://www.autohotkey.com/download/

今回、v1 対応スクリプトのため、後で v1.1.37.01 を途中でインストールします。

AutoHotkey v2.0.10


スクリプト作成

AutoHotkey Dash を開いて、New script を選択します。
AutoHotkey Dash New script


ファイル名部分を「git_bash_here」とし、
保存先フォルダは、C:\Users\admin\Documents\AutoHotkey とします。(任意です。)


Empty を選択して、Create をクリックします。

Create


C:\Users\admin\Documents\AutoHotkey
に空の内容の
git_bash_here.ahk
が作成されるため、メモ帳などのエディタで内容を記述して、上書き保存します。

git_bash_here.ahk保存


スクリプトの内容と意味は、以下の通りです。
コメントに意味を記載しています。
コメント部分は削除しても構いません。

git_bash_here.ahk
#NoEnv  ; 環境変数を使用しない(推奨テンプレート的なコード)
SendMode Input  ; 再生中に予期せぬウィンドウが現われて動作が妨げられるのを防ぐ(推奨テンプレート的なコード)
SetWorkingDir %A_ScriptDir%  ; スクリプトの作業ディレクトリをスクリプト自身が存在するディレクトリに設定(推奨テンプレート的なコード)
SetBatchLines, -1  ; スクリプトを一時停止無しにして最大速度で実行

#NoTrayIcon  ; タスクトレイにアイコンを表示しない

SetTitleMatchMode RegEx  ; ウィンドウのタイトルを指定する際に正規表現を使用することを許可
return

#IfWinActive ahk_class ExploreWClass|CabinetWClass  ; Windows Explorerがアクティブなときにのみ次のホットキーが有効になるようにする
    ^Space::  ; Ctrl+Spaceで次の関数が呼び出される
        OpenGbHere()  ; OpenGbHereという名前の関数を呼び出し
    return  ; ホットキーの処理を終了
#IfWinActive  ; #IfWinActiveディレクティブを終了

GetActiveExplorerTab(hwnd:="")  ; "GetActiveExplorerTab"という関数を定義。引数はウィンドウハンドル"hwnd"で、デフォルト値は空文字列
{
    static IID_IShellBrowser := "{000214E2-0000-0000-C000-000000000046}"  ; "IID_IShellBrowser"という静的変数を定義し、その値を"{000214E2-0000-0000-C000-000000000046}"に設定。{000...}はシェルブラウザのインターフェース識別子

    activeTab := 0, hwnd := hwnd ? hwnd : WinExist("A")  ; "activeTab"という変数を0に初期化し、"hwnd"が指定されていない場合は現在アクティブなウィンドウのハンドルを取得
    try
        ControlGet, activeTab, Hwnd,, ShellTabWindowClass1, ahk_id %hwnd%    ; アクティブなタブのウィンドウハンドルを取得
    catch
    try
        ControlGet, activeTab, Hwnd,, TabWindowClass1, ahk_id %hwnd%    ; アクティブなタブのウィンドウハンドルを取得
    for w in ComObjCreate("Shell.Application").Windows {  ; シェルアプリケーションのすべてのウィンドウをループ
        if (w.hwnd != hwnd)  ; ウィンドウのハンドルがアクティブなウィンドウハンドルと一致しない場合はスキップ
            continue
        if (activeTab) {  ; アクティブなタブがある場合、true
            shellBrowser := ComObjQuery(w, IID_IShellBrowser, IID_IShellBrowser)  ; シェルブラウザのインターフェースを取得
            DllCall(NumGet(NumGet(shellBrowser+0), 3*A_PtrSize), "UPtr",shellBrowser, "UIntP",thisTab:=0)  ; 現在のタブを取得
            if (thisTab != activeTab)  ; 現在のタブがアクティブなタブと一致しない場合はスキップ
                continue
        }
        return w  ; 正しいタブを見つけたら、そのウィンドウを返す
    }
}

OpenGbHere()
{
    tab := GetActiveExplorerTab()  ; 現在アクティブなエクスプローラータブを取得
    switch ComObjType(tab.Document, "Class")  ; 現在のタブの種類に基づいて異なるアクションを実行
    {
        case "ShellFolderView":  ; 現在のタブが通常のフォルダを表示している場合のアクションを定義
            full_path := tab.Document.Folder.Self.Path  ; 現在のフォルダのフルパスを取得
            StringReplace, full_path, full_path, `r, , all  ; 念のため - すべてのキャリッジリターン (`r) を削除
            IfInString full_path, \  ; フルパスがバックスラッシュを含むかどうかをチェック
            {
                Run,  C:\Program Files\Git\git-bash.exe, %full_path%  ; フルパスがバックスラッシュを含む場合、そのパスでGit bashを開く
            }
            else
            {
                Run, C:\Program Files\Git\git-bash.exe --cd-to-home  ; フルパスがバックスラッシュを含まない場合、ホームディレクトリでGit bashを開く
            }
        default: ;case "HTMLDocument":  ; 現在のタブがHTMLドキュメント(Webページなど)を表示している場合のアクション
            Run, C:\Program Files\Git\git-bash.exe --cd-to-home  ; ホームディレクトリでGit bashを開く
    }
}

https://gist.github.com/yiboyang/c4a4656660cfd0503b7f46e9edbb6f72 を参考にさせていただきました。そのままいけるかと思ったのですが、今回の検証環境では、

WinGetText, full_path, A

で full_path を捉えることができず、

https://www.autohotkey.com/boards/viewtopic.php?f=83&t=109907 を参考にして(と言うかコピペして)エクスプローラーで開いているパスを取得するようにしました。

このコードは素晴らしく、エクスプローラーでタブを使っていても開いているパスを取得します。

エクスプローラーのタブは、Windows 11 22H2 以降の機能です。


AHK 実行

git_bash_here.ahk を右クリックプログラムから開くAutoHotkey Launcher で AHK スクリプトを起動します。

AutoHotkey Launcher


しかし、今回の場合、AutoHotkey v2 をインストールしたのに、 v1 形式のスクリプトを起動したため、自動認識されて、v1 をインストールするように促されます。
v2 で v1 形式のスクリプトは実行できないため、素直にインストールします。

v1インストール


v1インストール完了


もう一度、git_bash_here.ahk を右クリックプログラムから開くAutoHotkey Launcher で AHK スクリプトを起動します。

再びAutoHotkey Launcher


特に何も起きません。


動作確認

エクスプローラーでどこかフォルダを開いて、CTRL + Space を押します。

CTRL + Space


Open Git Bash here ヨシッ!


タブがあっても大丈夫です。(間違って、先頭のタブのパスで開くとかは無いです。) タブ切り替え CTRL + Space


Open Git Bash here!


Startup 登録

まだこのままの場合、Windows を再起動すると、CTRL + Space が無反応になります。


git_bash_here.ahk
のショートカットを
C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
に置く必要があります。

%username% 部分は、エクスプローラーのパス入力欄に張り付ければ、ユーザー名に置き換わります。


以下のように設置しておけば、Windows を再起動しても、CTRL + Space で Open Git Bash here です。

ショートカット設置


再起動後、CTRL + SpaceでOpen Git Bash here


Open Git Bash here ヨシッ!

loading...