集成到右键菜单

在资源管理器中,空白处右键(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 进程重启。

此外,可以参考 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\中。

有趣的是,当(默认)被设置为空值或其它值后,可以看到标志着存在二级菜单的>,但却无法弹出二级菜单;另外,如果列表中对应的项不存在,也同样无法弹出二级菜单。

启动方式

在开始菜单中,有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中,还有一些其它方案:

事实上,上面的几个方案最终都调用了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"

巧的是,这样一来,不论是从“开始”菜单中快捷方式启动,还是从右键菜单中启动,它们在任务栏上都被合并在了一起。

[msys2]集成到右键菜单的更多相关文章

  1. Msbuild项目集成右键菜单编译

    DS1.背景:   我们为什么要将VS2008命令行编译.sln文件集成到右键菜单呢? 原因一:VS2008很好很强大,但太费系统资源了,尤其是在虚拟机在里面装VS2008的时候更是如此. 原因二:有 ...

  2. sublime使用技巧之添加到右键菜单、集成VI

    熟悉开发工具,减少多余的操作流程有助于提高开发效率,而Sublime Text 2是sublime产品的经典版本,因此本文基于Sublime Text 2讲解sublime的使用技巧. VI的主要作用 ...

  3. 关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类

    Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Menu类,在前面章节中已经介绍过Menu类的使用. 菜单项用MeauItem类来实现.但是在实际开发中,同一种功 ...

  4. SNF快速开发平台MVC-EasyUI3.9之-DataGrid表格控件如何增加右键菜单

    如题,我们在项目开发当中会遇到需要,表格控件增加右键菜单的使用. 下面我们就以SNF框架增加右键菜单步骤如下: 1.在加载页面当中增加如下菜单定义 <div id="mm" ...

  5. 使用CefSharp在.Net程序中嵌入Chrome浏览器(七)——右键菜单

    一个常用的功能就是禁止浏览器本身的右键菜单,靠在WPF中拦截鼠标事件是不行的,可以通过设置MenuHandler来实现. 首先实现一个IContextMenuHandler. public class ...

  6. UltraEdit程序设置添加到右键菜单

    http://hellofs.blog.51cto.com/6109153/1180681 以前安装UltraEdit软件,在安装过程中选择将其添加到右键菜单,安装完成后就可以正常显示在右键菜单,这样 ...

  7. windows下命令行利器---Cmder(安装,中文乱码,配置右键菜单)

    很多人都是在win下开发的,这样就会出现,经常需要命令行操作,而win cmd命令和linux命令有很大差异,导致大家很难受,今天给大家介绍一个win下命令行的利器-Cmder 一.先看一下它的容颜 ...

  8. 添加删除系统右键菜单(就是上下文菜单,也就是Context Menu)中的一些选项

    随着电脑安装的东西越来越多,右侧菜单也原来越长,很不方面.所以打算清理一下 我删除的大约以下几个,友好一点的都可以配置.当然也可以通过注册表直接删除. 特:注册表备份,即导入导出,避免一失足成千古恨. ...

  9. Win11右键菜单怎么修改为传统Win10右键风格?

    前言 对于开发者而言,右键菜单会集成一些功能,升级 Win11 的右键菜单反而对开发造成不便,所以修改回传统风格. 修改成果如下 两个步骤改回传统右键风格 第一步:首先用鼠标右键点击开始菜单,选择 w ...

随机推荐

  1. POJ 1743 Musical Theme【SAM】

    POJ1743 Musical Theme 要找长度\(\ge 5\)且出现次数\(\ge 2\)并且第一次出现和最后一次出现不重叠的最长子串. 题目条件中,如果对于两个串,在一个串的每个数上都加上相 ...

  2. Uva 10815 Andy's First Dictionary(字符串)

    题目链接:https://vjudge.net/problem/UVA-10815 题意 找出一段文本中的所有单词,以小写形式按照字典序输出. 思路 用空白符替换文本中所有非字母字符后再次读入. 代码 ...

  3. 【uva 1151】Buy or Build(图论--最小生成树+二进制枚举状态)

    题意:平面上有N个点(1≤N≤1000),若要新建边,费用是2点的欧几里德距离的平方.另外还有Q个套餐,每个套餐里的点互相联通,总费用为Ci.问让所有N个点连通的最小费用.(2组数据的输出之间要求有换 ...

  4. 三、Jmeter 定时器

    首先需要清楚Jmeter中各个元件的执行顺序: 元件的执行顺序 了解了元件有作用域之后,来看看元件的执行顺序,元件执行顺序的规则很简单,在同一作用域名范围内,测试计划中的元件按照如下顺序执行. (1) ...

  5. windows cmd 查看远程连接端口

    查看远程端口号 Cmd tasklist  /svc 在输出的内容中查找svchost.exe进程下termservice服务对应的PID,在此查看的PID为:276 然后输入命令:netstat   ...

  6. 手把手搭建一套基于 Sentry 的异常监控系统

    手把手搭建一套基于 Sentry 的异常监控系统 Sentry 开源版 DevOps refs https://github.com/getsentry/sentry sentry-anomaly-m ...

  7. TypeScript Errors All In One

    TypeScript Errors All In One 1. Property 'name' has no initializer and is not definitely assigned in ...

  8. 如何使用 js 检测控制台被用户打开了

    如何使用 js 检测控制台被用户打开了 js solutions 监听 F12 事件 监听键盘快捷键组合 Ctrl + Shift + I Option + Command + I Object.to ...

  9. npm & app-node-env

    npm & app-node-env $ npm i -g app-node-env # OR $ yarn global add app-node-env demo $ ane env=ap ...

  10. server sent events

    server sent events server push https://html5doctor.com/server-sent-events/ https://developer.mozilla ...