若有錯誤,歡迎指出html
在資源管理器中,空白處右鍵(right-clicking on folder backround in Windows Explorer)會彈出菜單,其中有如「在此處打開cmd」等選項,這些選項顯著提升了「工做」效率。這篇文章所要講述的即爲:「如何將MSYS2
集成到右鍵菜單中——編輯註冊表」。python
資源管理器「右鍵菜單」的註冊表項位於HKCR\Directory\
中。其中,Background\shell\
決定了在空白處右擊(right-clicking on folder backround in Windows Explorer),彈出的菜單內容;shell\
決定了在文件夾上(on folder itself)右擊,彈出菜單的內容。git
這裏根據子項cmd
,作一個簡單的解釋:github
cmd
shell
cmd\command
windows
Extended
,空值,擁有該數據項意味着當按住shift
鍵右擊時,纔可看到該菜單項,不然按住shift
與否,都可看到;bash
HideBasedOnVelocityId
,查看Powershell
可發現其擁有ShowBasedOnVelocityId
,這兩個數據項決定了,誰隱藏,誰顯示;ide
MUIVerb
:菜單項的顯示文本。若是沒有該數據項,則顯示(默認)
數據項的值(雖然在cmd
中,看起來很奇怪),若是(默認)
未設置值或爲空值,則顯示爲項名稱;idea
command
子項,(默認)
數據項:即爲要執行的命令,其中%V
表示當前目錄,是註冊表內置的變量;命令行
若傳遞了錯誤的註冊表變量,甚至會致使 explorer.exe 進程重啓。
Icon
:.ico
圖標文件的路徑;
SubCommands
:二級菜單項列表,用;
分隔,對應實體位於HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\
中。
有趣的是,當
(默認)
被設置爲空值或其它值後,能夠看到標誌着存在二級菜單的>
,但卻沒法彈出二級菜單;另外,若是列表中對應的項不存在,也一樣沒法彈出二級菜單。![]()
在開始菜單中,有MSYS2 64bit
,其中有三個快捷方式分別用於啓動MSYS2
的三個子系統。
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\MSYS2 64bit
查看屬性可知,它們都調用了一個叫作msys2_shell.cmd
的腳本,該腳本位於MSYS2
安裝目錄下,傳遞/?
查看以可用選項。
結合 bat經常使用命令 以幫助閱讀該腳本。
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2] "MUIVerb"="Open MSYS2 Here" "Extended"="" "SubCommands"="MSYS2.MSYS;MSYS2.MinGW 64-bit" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MSYS] "MUIVerb"="MSYS" "Icon"="D:\\msys64\\msys2.ico" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MSYS\command] @="D:\\msys64\\msys2_shell.cmd -msys -here" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MinGW 64-bit] "MUIVerb"="MinGW 64-bit" "Icon"="D:\\msys64\\mingw64.ico" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MinGW 64-bit\command] @="D:\\msys64\\msys2_shell.cmd -mingw64 -here"
Windows Registry Editor Version 5.00 [-HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2] [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MSYS] [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MinGW 64-bit]
上面經過使用msys2_shell.cmd
啓動,能夠很明顯地看到閃現出一個cmd
黑框,這是運行批腳本沒法避免的問題。
但經過開始菜單中的快捷方式啓動時,幾乎看不到黑框。
在Lauchers中,還有一些其它方案:
mintty.exe
啓動。msys2.exe
、mingw64.exe
、mingw32.exe
,它們分別讀取同名的.ini
文件,以啓動對應的子系統。msys2-launcher
中的.exe
啓動。(無黑框)事實上,上面的幾個方案最終都調用了mintty.exe
。
上面已經說明了如何經過修改註冊表添加右鍵菜單,並給出了msys2
的一種啓動方式,但該方法並不完美。
在Lauchers的最後,The idea部分,說到:
若是你須要正確啓動一個shell,但上面說起的方法中又沒有適合的,那麼能夠基於下面的知識來制定你本身的方法:
MSYSTEM=...
,其值可爲MSYS
,MINGW32
,或MINGW64
;若是條件限制你只能使用一行語句,那麼典型的寫法是:
C:/msys64/usr/bin/env MSYSTEM=MSYS /usr/bin/bash -li
另外,若是須要保持當前工做目錄,那麼還須要設置CHERE_INVOKING=1
;若是你須要運行一個特定的命令而非 interactive shell,你仍須要經過一個 login shell 來運行,如:... /usr/bin/bash -lc python
。
在用戶主目錄中,有三個啓動腳本:
.bash_profile
~/.bashrc
.profile
~/.bash_profile
或~/.bash_login
,則不執行~/.bashrc
.bashrc
[[ "$-" != *i* ]] && return
,該腳本將當即退出能夠發現以上腳本均不包含與子系統相關的內容,下面考察/etc
內的幾個啓動腳本:
msystem
profile
調用MSYSTEM
說明了啓動那個子系統,根據語句export MSYSTEM="${MSYSTEM:-MSYS}"
可知,若未指定MSYSTEM
,則默認爲MSYS
MSYSTEM
設置以下環境變量:
MSYSTEM_PREFIX
MSYSTEM_CARCH
MSYSTEM_CHOST
MINGW_CHOST
MINGW_PREFIX
MINGW_PACKAGE_PREFIX
CONFIG_SITE
MSYS
,則上述不包含前綴MINGW_
的變量profile
MSYS2_PATH_TYPE
(默認爲minimal
)設置環境變量ORIGINAL_PATH
,然後該變量將參與設置PATH
/etc/msystem
MSYSTEM
以及上一步中獲得的環境變量,進一步設置環境,如PATH
,MANPATH
/etc/profile.d/
中的腳本bash.bashrc
這是一個神祕的變量,經過設置該變量,可使打開的 shell 保留當前工做目錄,而不是自動修改成用戶主目錄。在Starting in a particular directory中說明了這一做用。在msys2-launcher
的源碼和msys2_shell.cmd
中均可以看到該變量的身影。
但奇怪的是,我沒有在任何 shell 啓動腳本中找到這一變量,因此我不知道它在何處起了做用,但它又的的確確起了做用。
參考Taskbar icon grouping,任務欄上的圖標會根據圖標自己和啓動命令進行自動合併,也可經過設置AppID
來提供更優先的合併依據。
考慮到「開始」菜單裏的快捷方式是安裝msys2
時自動建立的,因此這裏就再也不對其作出修改了。
綜上所述,獲得註冊表文件以下:
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shell\MSYS2] "MUIVerb"="Open MSYS2 Here" "Extended"="" "SubCommands"="MSYS2.MSYS;MSYS2.MinGW 64-bit" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MSYS] "MUIVerb"="MSYS" "Icon"="D:/msys64/msys2.ico" ; 開始的可執行文件路徑必須用反斜槓(back-slash)形式。儘管使用斜槓(slash)在資源管理器中 ; 是有效的,但在註冊表中是無效的。 ; mintty 的選項 --dir \"%V/\" 是沒有必要的。 ; 這裏的 title 和 msys2_shell.cmd 中的保持了一致。 ; 將 env 放在前面也能夠啓動,但會閃現黑框,這是由於 env 是命令行程序,須要在終端中執行, ; 而默認終端即爲 cmd;而 mintty 爲圖形程序。 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MSYS\command] @="D:\\msys64\\usr\\bin\\mintty -i /msys2.ico -t \"MSYS2 MSYS\" /bin/env MSYSTEM=MSYS CHERE_INVOKING=1 /usr/bin/bash -li" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MinGW 64-bit] "MUIVerb"="MinGW 64-bit" "Icon"="D:/msys64/mingw64.ico" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MSYS2.MinGW 64-bit\command] @="D:\\msys64\\usr\\bin\\mintty -i /mingw64.ico -t \"MinGW x64\" /bin/env MSYSTEM=MINGW64 CHERE_INVOKING=1 /usr/bin/bash -li"
巧的是,這樣一來,不管是從「開始」菜單中快捷方式啓動,仍是從右鍵菜單中啓動,它們在任務欄上都被合併在了一塊兒。