[msys2]集成到右键菜单
集成到右键菜单
在资源管理器中,空白处右键(right-clicking on folder backround in Windows Explorer)会弹出菜单,其中有如“在此处打开cmd”等选项,这些选项显著提高了“工作”效率。这篇文章所要讲述的即为:“如何将MSYS2集成到右键菜单中——编辑注册表”。
背景知识
注册表
资源管理器“右键菜单”的注册表项位于HKCR\Directory\中。其中,Background\shell\决定了在空白处右击(right-clicking on folder backround in Windows Explorer),弹出的菜单内容;shell\决定了在文件夹上(on folder itself)右击,弹出菜单的内容。

这里根据子项cmd,做一个简单的解释:
cmd

cmd\command

Extended,空值,拥有该数据项意味着当按住shift键右击时,才可看到该菜单项,否则按住shift与否,均可看到;
HideBasedOnVelocityId,查看Powershell可发现其拥有ShowBasedOnVelocityId,这两个数据项决定了,谁隐藏,谁显示;
MUIVerb:菜单项的显示文本。如果没有该数据项,则显示(默认)数据项的值(虽然在cmd中,看起来很奇怪),如果(默认)未设置值或为空值,则显示为项名称;
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安装目录下,传递/?查看以可用选项。
结合
.\BatchScript.md以帮助阅读该脚本。
注册表文件
注册
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中,还有一些其它方案:
- https://gist.github.com/magthe/a60293fe395af7245a9e
- 右键菜单集成,通过调用
mintty.exe启动。
- 右键菜单集成,通过调用
- https://github.com/msys2/msys2-launcher
- 该项目提供了
msys2.exe、mingw64.exe、mingw32.exe,它们分别读取同名的.ini文件,以启动对应的子系统。
- 该项目提供了
- https://gist.github.com/elieux/ef044468d067d68040c7
- 右键菜单集成,通过调用
msys2-launcher中的.exe启动。(无黑框)
- 右键菜单集成,通过调用
事实上,上面的几个方案最终都调用了mintty.exe。
最终方案
上面已经说明了如何通过修改注册表添加右键菜单,并给出了msys2的一种启动方式,但该方法并不完美。
The idea
在Lauchers的最后,The idea部分,说到:
如果你需要正确启动一个shell,但上面提及的方法中又没有适合的,那么可以基于下面的知识来制定你自己的方法:
- 在环境中设置
MSYSTEM=...,其值可为MSYS,MINGW32,或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
- 启动为 login shell 时被执行,如果已存在
.bashrc- 启动为交互式shell 时被执行
- 当仅启动为 login shell 时,该脚本仍会被调用,但根据语句
[[ "$-" != *i* ]] && return,该脚本将立即退出
可以发现以上脚本均不包含与子系统相关的内容,下面考察/etc内的几个启动脚本:
msystem- 该脚本由
profile调用 - 环境变量
MSYSTEM说明了启动那个子系统,根据语句export MSYSTEM="${MSYSTEM:-MSYS}"可知,若未指定MSYSTEM,则默认为MSYS - 根据
MSYSTEM设置如下环境变量:MSYSTEM_PREFIXMSYSTEM_CARCHMSYSTEM_CHOSTMINGW_CHOSTMINGW_PREFIXMINGW_PACKAGE_PREFIXCONFIG_SITE- 如果子系统为
MSYS,则上述不包含前缀MINGW_的变量
- 该脚本由
profile- System-wide profile file
- 根据环境变量
MSYS2_PATH_TYPE(默认为minimal)设置环境变量ORIGINAL_PATH,而后该变量将参与设置PATH - 调用
/etc/msystem - 根据
MSYSTEM以及上一步中得到的环境变量,进一步设置环境,如PATH,MANPATH - 根据 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"
巧的是,这样一来,不论是从“开始”菜单中快捷方式启动,还是从右键菜单中启动,它们在任务栏上都被合并在了一起。
[msys2]集成到右键菜单的更多相关文章
- Msbuild项目集成右键菜单编译
DS1.背景: 我们为什么要将VS2008命令行编译.sln文件集成到右键菜单呢? 原因一:VS2008很好很强大,但太费系统资源了,尤其是在虚拟机在里面装VS2008的时候更是如此. 原因二:有 ...
- sublime使用技巧之添加到右键菜单、集成VI
熟悉开发工具,减少多余的操作流程有助于提高开发效率,而Sublime Text 2是sublime产品的经典版本,因此本文基于Sublime Text 2讲解sublime的使用技巧. VI的主要作用 ...
- 关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类
Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Menu类,在前面章节中已经介绍过Menu类的使用. 菜单项用MeauItem类来实现.但是在实际开发中,同一种功 ...
- SNF快速开发平台MVC-EasyUI3.9之-DataGrid表格控件如何增加右键菜单
如题,我们在项目开发当中会遇到需要,表格控件增加右键菜单的使用. 下面我们就以SNF框架增加右键菜单步骤如下: 1.在加载页面当中增加如下菜单定义 <div id="mm" ...
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(七)——右键菜单
一个常用的功能就是禁止浏览器本身的右键菜单,靠在WPF中拦截鼠标事件是不行的,可以通过设置MenuHandler来实现. 首先实现一个IContextMenuHandler. public class ...
- UltraEdit程序设置添加到右键菜单
http://hellofs.blog.51cto.com/6109153/1180681 以前安装UltraEdit软件,在安装过程中选择将其添加到右键菜单,安装完成后就可以正常显示在右键菜单,这样 ...
- windows下命令行利器---Cmder(安装,中文乱码,配置右键菜单)
很多人都是在win下开发的,这样就会出现,经常需要命令行操作,而win cmd命令和linux命令有很大差异,导致大家很难受,今天给大家介绍一个win下命令行的利器-Cmder 一.先看一下它的容颜 ...
- 添加删除系统右键菜单(就是上下文菜单,也就是Context Menu)中的一些选项
随着电脑安装的东西越来越多,右侧菜单也原来越长,很不方面.所以打算清理一下 我删除的大约以下几个,友好一点的都可以配置.当然也可以通过注册表直接删除. 特:注册表备份,即导入导出,避免一失足成千古恨. ...
- Win11右键菜单怎么修改为传统Win10右键风格?
前言 对于开发者而言,右键菜单会集成一些功能,升级 Win11 的右键菜单反而对开发造成不便,所以修改回传统风格. 修改成果如下 两个步骤改回传统右键风格 第一步:首先用鼠标右键点击开始菜单,选择 w ...
随机推荐
- poj 2007 凸包构造和极角排序输出(模板题)
Scrambled Polygon Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10841 Accepted: 508 ...
- CodeForces 893C (并查集板子题)
刷题刷到自闭,写个博客放松一下 题意:n个人,m对朋友,每寻找一个人传播消息需要花费相应的价钱,朋友之间传播消息不需要花钱,问最小的花费 把是朋友的归到一起,求朋友中花钱最少的,将所有最少的加起来. ...
- Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) C. The Delivery Dilemma (贪心,结构体排序)
题意:你要买\(n\)份午饭,你可以选择自己去买,或者叫外卖,每份午饭\(i\)自己去买需要消耗时间\(b_i\),叫外卖需要\(a_i\),外卖可以同时送,自己只能买完一份后回家再去买下一份,问最少 ...
- LInux 终端命令
删除目录: 绝对路径开头以"/"开始之后跟着根目录或家目录 删除后不会在垃圾站中 树的顶部那个'.'代表当前目录 用mv命令对一个存在文件重命名 这个more关键字一次性显示不完的 ...
- OpenStack服务默认端口号
在某些部署中,例如已设置限制性防火墙的部署,您可能需要手动配置防火墙以允许OpenStack服务流量. 要手动配置防火墙,您必须允许通过每个OpenStack服务使用的端口的流量.下表列出了每个Ope ...
- Maven与Nexus3.x环境构建详解
一.Maven介绍Apache Maven是一个创新的软件项目管理和综合工具.Maven提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文件. ...
- Leetcode(868)-二进制间距
给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...
- C# 类 (8) - 抽象方法
抽象 抽象方法 只能 定义在抽象类 里,并且抽象方法里没有具体的代码,像这种 为啥要定义一个空空如也的函数呢?这是为了用来约束 它的派生类 的行为, 这个例子,建立了一个数组,放了cat和dog,这两 ...
- npm/yarn查看当前使用源与设置其它源
npm, yarn查看源和换源: npm config get registry // 查看npm当前镜像源 npm config set registry https://registry.npmj ...
- 康托展开:对全排列的HASH和还原,判断搜索中的某个排列是否出现过
题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2297 前置技能:(千万注意是 ...
