[msys2]集成到右鍵菜單

集成到右鍵菜單

若有錯誤,歡迎指出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

image-20210220211323843

這裏根據子項cmd,作一個簡單的解釋:github

cmdshell

cmd\commandwindows

Extended,空值,擁有該數據項意味着當按住shift鍵右擊時,纔可看到該菜單項,不然按住shift與否,都可看到;bash

HideBasedOnVelocityId,查看Powershell可發現其擁有ShowBasedOnVelocityId,這兩個數據項決定了,誰隱藏,誰顯示;ide

MUIVerb:菜單項的顯示文本。若是沒有該數據項,則顯示(默認)數據項的值(雖然在cmd中,看起來很奇怪),若是(默認)未設置值或爲空值,則顯示爲項名稱;idea

command子項,(默認)數據項:即爲要執行的命令,其中%V表示當前目錄,是註冊表內置的變量;命令行

若傳遞了錯誤的註冊表變量,甚至會致使 explorer.exe 進程重啓。

此外,能夠參考 https://superuser.com/questions/136838/which-special-variables-are-available-when-writing-a-shell-command-for-a-context

Icon.ico圖標文件的路徑;

SubCommands:二級菜單項列表,用;分隔,對應實體位於HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\中。

有趣的是,當(默認)被設置爲空值或其它值後,能夠看到標誌着存在二級菜單的>,但卻沒法彈出二級菜單;另外,若是列表中對應的項不存在,也一樣沒法彈出二級菜單。

image-20210221001313520

啓動方式

在開始菜單中,有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的一種啓動方式,但該方法並不完美。

The idea

Lauchers的最後,The idea部分,說到:

若是你須要正確啓動一個shell,但上面說起的方法中又沒有適合的,那麼能夠基於下面的知識來制定你本身的方法:

  • 在環境中設置MSYSTEM=...,其值可爲MSYSMINGW32,或MINGW64
  • 然後運行一個 login shell

若是條件限制你只能使用一行語句,那麼典型的寫法是:

C:/msys64/usr/bin/env MSYSTEM=MSYS /usr/bin/bash -li

另外,若是須要保持當前工做目錄,那麼還須要設置CHERE_INVOKING=1;若是你須要運行一個特定的命令而非 interactive shell,你仍須要經過一個 login shell 來運行,如:... /usr/bin/bash -lc python

shell 啓動腳本

在用戶主目錄中,有三個啓動腳本:

  • .bash_profile

    • 啓動爲 login shell 時被執行
    • 該腳本中調用了~/.bashrc
  • .profile

    • 啓動爲 login shell 時被執行,若是已存在~/.bash_profile~/.bash_login,則不執行
    • 該腳本中調用了~/.bashrc
  • .bashrc

    • 啓動爲交互式shell 時被執行
    • 當僅啓動爲 login shell 時,該腳本仍會被調用,但根據語句[[ "$-" != *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
    • System-wide profile file
    • 根據環境變量MSYS2_PATH_TYPE(默認爲minimal)設置環境變量ORIGINAL_PATH,然後該變量將參與設置PATH
    • 調用/etc/msystem
    • 根據MSYSTEM以及上一步中獲得的環境變量,進一步設置環境,如PATHMANPATH
    • 根據 shell(bash、ksh、zsh),調用/etc/profile.d/中的腳本
  • bash.bashrc
    • System-wide bashrc file

CHERE_INVOKING

這是一個神祕的變量,經過設置該變量,可使打開的 shell 保留當前工做目錄,而不是自動修改成用戶主目錄。在Starting in a particular directory中說明了這一做用。在msys2-launcher的源碼和msys2_shell.cmd中均可以看到該變量的身影。

但奇怪的是,我沒有在任何 shell 啓動腳本中找到這一變量,因此我不知道它在何處起了做用,但它又的的確確起了做用。

Windows 任務欄圖標

參考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"

巧的是,這樣一來,不管是從「開始」菜單中快捷方式啓動,仍是從右鍵菜單中啓動,它們在任務欄上都被合併在了一塊兒。

相關文章
相關標籤/搜索