Windows 最速启动流

前言

突然发现好久没写中文文章,之前在 2023 年度总结 - 游戏篇#总结 提到要公开 Obsidian 月度记录的游戏报告部分,然而都快二月末了还没抽出时间修改 Obsidian 模板,甚至连 2023 的年度总结都还没整理完。正好今天看到小众软件 10 年前的文章 Win+R 最快的启动和搜索新玩法 ,花了点时间强化多年来建立的「Windows 最速启动流」,姑且写一篇介绍。

原理

非常简单,其实就是 Win + R,或者说 Win + Run,下面所有实战和技巧都是围绕这点展开,难度逐步升高,但都一目了然,没什么 dirty hack。最简单的实现就不说了,直接参考小众软件另一篇 06 年的文章 Win+R – 最 cool 最省资源的快速启动,不能说异曲同工,确实是不谋而合。就是创建一个文件夹并添加到环境变量的 PATH

说是「最速」,但理论上讲,快捷键可能比 Win + R 更快一点点,击键次数也更少,但快捷键毕竟需要记忆按键组合,而且 Windows 本身也有不少快捷键,需要一番努力才能完全避免冲突和混乱。而 Win + R 想用什么缩写就用什么缩写,自然语言在记忆速度方面拥有巨大优势,综合来看后者才是真正的「最速」。

VI/VIM Keyboard Remapping with Hotkeys Highlighted 经典的 vi/vim 键盘图,新手必须经历的快捷键地狱,快捷键流发展的最终归宿

实战

文件(夹)映射

最简单的一种,比如复制 Firefox 的快捷方式到 #原理 中添加到环境变量的文件夹,然后将新快捷方式重命名为 ff,之后就可以 Win + R 再输入 ff 和回车启动火狐。

虽然看起来非常慢,可能还不如直接在桌面放个图标,但毕竟是最简单的应用,不可能上来就甩一个几十行的批处理处理各种情况。即使这样还是有两个好处:

  • 快速,是的,快速,能用键盘操作就不用鼠标,这样才能最大限度提高输入效率,毕竟鼠标不方便定位,还要慢慢挪到图标的位置。如果是指哪打哪的轨迹球和数位板,或许没有这个问题,但需要快速按顺序依次打开一堆文件和文件夹时,键盘流的优势就体现出来了。
  • 精简桌面图标,虽然还没有到「美化的尽头是默认」的程度 1,但我的桌面确实只有回收站和任务栏,剩下的空间全部留给壁纸,这也是我多年前研究快速启动的初衷。得益于此,我的开始菜单也是能删则删,除了置顶的个位数 app,完全用不到进一步展开的全部菜单。

顺带一提,为了快速删除不需要的开始菜单,我也给开始菜单文件夹建了别名为 sm(Start Menu)的快捷方式🤣

命令行参数

上面那种其实已经足够覆盖大部分使用场景,事实上,我对应文件夹的文件数量不到 180 ,其中有将近 140 种是最基础的快捷方式。命令行参数也非常简单,只稍微举个例子就跳过了。比如我想每次启动 Chromium 都使用隐身模式,直接复制快捷方式,在 Target 一栏后面添加 -incognito 参数即可。更完整的例子可以参照 Fix WSL Audio Output。这种方式如果用得好其实比设置 Windows 服务和计划任务更加灵活(当然也有更适合后面两种的使用场景)。

批处理

这是本次最速启动流强化的重点,从简单的说起。

复制下面的代码,保存为 ddg.bat 并放到对应文件夹:

@echo off
set url=https://lite.duckduckgo.com/lite?q=%1
start firefox %url%

之后就可以 Win + R,然后输入 ddg test 和回车就能在 Firefox 中使用 DuckDuckGoLite 以 test 为关键词进行搜索。随后再创建一个 ddg.bat 的快捷方式并重命名为 d,即可使用 d test 进行搜索。

前面忘了说,Win + R 虽然不像快捷键那样需要考虑组合键冲突,但同样有可能遇到系统占用了对应别名的情况。例如 2021 年刚接触 PPSSPP 时,我就尝试使用 psp 启动 PPSSPP 结果怎么试都不行,最后发现在 %SYSTEMROOT%\System32 目录存在一个 psp.exe(Machine Provisioning Security Process),而出于安全考虑,环境变量中系统目录的优先级要高于 2 我设置的快捷方式目录,所以 PPSSPP 的别名就被系统进程替代了。为了避免这种情况,建议配置前先 Win + R 试一下,如果提示 Windows cannot find 那就对了。

说回批处理,简单的毕竟还是太简单了,实际使用就会发现,?q=$1 处理不了带空格的参数,输入 d tomb raider 会在 DDG 搜索 tomb,然后打开一个空白页面并在地址栏输入 raider……实际解决也很简单,写个条件判断就行了 3

@echo off
setlocal enabledelayedexpansion
set "input=%*"
if not "%input%"=="" (
    set "input=!input: =+!"
    set "url=https://lite.duckduckgo.com/lite?q=!input!"
) else (
    set "url=https://lite.duckduckgo.com/lite"
)
start firefox %url%

这也意外解决了我一直想实现但懒得动手的功能:快速访问 VNDB 列表或搜索条目。替换 else 中的 URL 即可。也可以把 start firefox %url% 放到 if 语句中,然后 else 放入错误提示:

@echo off
setlocal enabledelayedexpansion
set "input=%*"
if not "%input%"=="" (
    set "input=!input: =+!"
    set "url=https://www.pcgamingwiki.com/w/index.php?search=!input!"
    start firefox %url%
) else (
    echo No input provided
)

对于部分不能添加到浏览器搜索引擎的网站,这种方法可以说是百试不爽。哪怕网站压根连搜索功能都不提供,也可以使用 site:example.com 或者 !Bang 筛选搜索结果从而达到近似的效果。当然,对于在 robots.txt 里禁止爬虫或者浅层网络访问不到的网站,还得各凭本事,另辟蹊径。

与此同时,甚至可以通过设置 BROWSER 环境变量,来灵活处理打开的浏览器,而不用每次换浏览器都要手动修改全部批处理文件。也可以设置多个类似的变量,如果 Firefox 启动不能,就启动 Chromium,还不行再启动 MSEdge。再延伸下去就超出「最速启动流」的范畴了,点到为止。

杂谈

最后说点小技巧,塞个快捷方式然后通过 AHK 映射快捷键,从而实现快速启动,或者直接给快捷方式分配全局快捷键。嗯,克制使用快捷键流还是可行的。比如 Alt + E 快速启动 Everything 和 Linux 一样通过 Ctrl + Alt + T 快速启动 Windows Terminal(并运行 Void Linux Musl WSL):

#NoTrayIcon
; Search
!e::
    {
        Run "D:\Path\To\ENV\everything"
    }
; Windows Terminal
^!t::
    {
        Run "wt.exe -p void-musl"
    }

由于 Windows shortcut 在 Linux 大概率无法识别,而 Windows 可以正常识别 symlink,于是反客为主,便于跨平台操作 (虽然批处理不跨平台,Linux 也没 Win + R4 ,不过不能软链接 shortcut:

# This works
ln -sf fdroid.bat fd
# This sucks
ln -s retroarch.lnk retro

当然,PowerToys Run 也可以实现 Win + R 类似的功能,看上去还更加高阶,但启动速度飘忽不定,而且同一个输入的输出不固定,其他所有快速启动工具同理。


  1. 实际上,虽然从 Windows 11 起弃用了图标包,但我还在使用多年前 DIY 的鼠标指针和头像 ↩︎

  2. 注意这个「高于」指的是优先级,和 Linux 中 PATH=$HOME/.loca/bin:$PATH 这样的「覆盖」操作结果是不一样的 ↩︎

  3. 不能直接使用 %*,这样会变成分别搜索 tombraider ↩︎

  4. 话虽如此,倒也不是真的完全没有,我曾在 Xfce4 和 KDE Plasma 上尝试用 F2/ Alt + F2 和 Shell 脚本作为 Win + R 的替代,但是冷启动速度慢得令人发指,功能也大打折扣,遂放弃 ↩︎

Vinfall's Geekademy

VENI VIDI VICI