ChrAlpha's Blog

Thumbnail-%E5%B0%86%20WSL%20%E8%8B%A5%E5%B9%B2%E9%AB%98%E9%A2%91%E6%93%8D%E4%BD%9C%E6%B7%BB%E5%8A%A0%E5%88%B0%20Windows%20%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95

将 WSL 若干高频操作添加到 Windows 右键菜单

2023-03-04·便签格

虽然早在两年前便配置好了 WSL 环境,但是由于某些原因暂时没空做开发,就一直丢在一边。近期由于参加的项目需要,又开始重新拾起 Python 做数据处理,但当真正频繁使用 WSL 的时候,才发觉任何稍微重复的动作都会极大影响体验。所以我才专门花半个下午研究,如何将几个常用 WSL 相关操作直接放进 Windows 默认右键菜单里,这样至少在我的应用场景中已经足够流畅了。

自定义后的 Windows 右键菜单

但是,本文 不讨论 WSL 相关配置,现已有许多文章对此详细讨论,例如 SpencerWoo 的 Dev on Windows with WSL —— 可能是市面上最详尽的中文 WSL 开发环境配置指南

Windows Terminal

任何人都可以批评 Windows 默认开发环境——没有好用的包管理系统(Scoop 前路漫漫)、没有好用的终端(PowerShell 也不争气,更别说 CMD 了)、环境变量不易配置……

而偏偏,微软整出的 Windows Terminal,还算得上好用。

假如你几乎所有终端都只需要在 WSL 中运行,那么最简单方法的就是在 Windows Terminal 配置文件中,将 defaultProfile 改成 WSL 的 guid。请放心,倘若在安装 WSL 之前已经开始使用 Windows Terminal 了,那么在安装 WSL 系统完成的时候,Windows Terminal 会自动完成 WSL 终端的相关配置,譬如下面的配置文件片段就不是我自行添加的而是 Windows 自动配置的。

Windows 自添加 WSL 配置片段

我们只需要——将此项的 guid 填入比较靠上方的 defaultProfile 内。

如果你和我一样,平时还是有一定使用 Windows 侧终端需求的,这里最好还是再额外添加一个选项供使用。

方法一——直接修改注册表。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt\command]
@="C:\\Users\\[[ your_name ]]\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe -p [[ your_terminal_name ]]"

注意替换 [[ ]]

  • [[ your_name ]]:替换为你的 Windows 账户名
  • [[ your_terminal_name ]]:WSL 终端在 Windows Terminal 中的名称

这样一来,在目录空白处右键,就能在当前位置打开 Windows Terminal 中的 WSL 卡片(怎么这么拗口……)。

WSL Terminal

方法二——借助 Context Menu Manager

其实这个方法更好用一些,但是本文按照我折腾的顺序组织,所以借助 Context Menu Manager 放在了方法二。

Context Menu Manager 是一款可以管理 Windows 右键菜单的工具,它可以增加或删除右键菜单的项目,支持不同的右键对象,如文件、文件夹、磁盘等。

在「目录背景」新建一个菜单项目,即可实现 在文件夹、桌面等空白位置右键 中添加操作。

添加 WSL Terminal 流程图
  • wt.exe:Windows Terminal 程序,安装时正常已添加环境变量
  • -p "Ubuntu":开启指定的命名为 Ubuntu 的配置文件而非默认,请更改为你的 WSL 配置文件命名
  • -d "%V"-d 参数控制 Windows Termina 打开的路径,%V 即为当前路径

在「目录」新建一个菜单项目,即可实现 对文件夹右键 中添加操作,流程和上图完全一致。

一般来说,有这两个右键菜单项目已经完全足够了。

VS Code

Visual Studio Code 是一款介乎于 Text Editor 和 IDE 之间的一款强大的代码编辑器。

微软虽然本身是相当大体量的闭源公司,但却收购了 GitHub、NPM 等一众开源基础设施,而 VS Code 也是微软最受欢迎的开源项目之一。
凭借自家优势,VS Code 几乎是默认支持 WSL 开发最易用的工具,且集成了 Git 版本控制,以及最重要的——所有功能开源免费,并在此基础上拥有庞大的社区插件支持。

默认在安装 VS Code 的时候已经将「通过 VS Code 打开」添加至右键菜单中,但是这里默认其实是以宿主机环境的 VS Code 打开,而非 WSL 中的。通过 VS Code 左下角 Remote 开发状态栏可以得知当前环境。

Remote 开发状态栏

尽管在 安装好相关插件 后,通过点击左下角的 Remote 开发状态栏并在弹出组件中选「New WSL Window」,即可进入 WSL 环境下的 VS Code。
又或者,在 WSL 任意 Shell 中通过 code [[ path dir ]] 即可在该位置打开 VS Code。

好像也不复杂。不过,对于一个频繁的操作来说,就像我前面提到的,任何多余操作带来的微小不便都会被无限放大。

这里还是借助 Context Menu Manager。

不过要注意的是,直接用 %V 当作路径传进去会出错,因为这是 Windows 格式的路径(譬如 C:\foo\bar)而 Linux Shell 无法理解。
即便通过字符串替换将 \ 全局替换为 / 也不行,WSL 中宿主机的存储是以盘符被挂载在 /mnt/c/(C 盘)、/mnt/d/ 之下的。

好在 WSL 安装是自带 wslpath 命令应对这种情况,不加参数时候默认将 Windows 路径转换为 WSL 路径。

wslpath 
Usage:
    -a    force result to absolute path format
    -u    translate from a Windows path to a WSL path (default)
    -w    translate from a WSL path to a Windows path
    -m    translate from a WSL path to a Windows path, with '/' instead of '\'

举个例子——

> wslpath "C:\foo\bar"
/mnt/c/foo/bar

所以正确获取路径的方式是 wslpath '%V',并通过 $(),将这个命令的输出传入某命令执行:

wsl code "$(wslpath '%V')"

在「文件」中添加即可以此为菜单命令的菜单项目即可。

而「目录」「目录背景」中则需要在 %V 后加一个斜线表示这是一个目录,而非文件。

wsl code "$(wslpath '%V')/"

或者:

wsl code "$(wslpath '%V\')"

又或者通过上一节提到的 -d "%V" 参数先控制 WSL 打开的路径,然后直接 code . 在当前目录打开 VS Code。

wsl.exe --cd "%V" code .

参考:

将 WSL 若干高频操作添加到 Windows 右键菜单
本文作者
ChrAlpha
发布日期
2023-03-04
更新日期
2024-02-21
转载或引用本文时请遵守 CC BY-NC-SA 4.0 许可协议,注明出处、不得用于商业用途!