Linux上的Bash命令行编辑功能强大,这得归功于readline这个库所提供的编辑功能。Windows上的命令行cmd.exe一向以功能简单,编辑能力原始为人所诟病。但是clink给cmd.exe在编辑方面带来了一剂良药。

安装

clink为cmd.exe带来了readline的集成,以至于你可以在cmd.exe中使用类似Vi的键绑定。

安装完clink之后,默认会修改注册表,然后在启动cmd.exe自动启动clink,会显示以下信息:

link v0.4.9 [git:2fd2c2] Copyright (c) 2012-2016 Martin Ridgers
http://mridgers.github.io/clink

如果没有的话,则需要手动inject一下,假设clink.exe在你的PATH环境变量中找到,执行clink autorun install

然后执行clink autorun show,会有类似一下的信息输出:

native : "C:\Users\name\scoop\apps\clink\current\clink.bat" inject --autorun

配置Vi键绑定

根据clink/issues/235的介绍的方法来配置%userprofile%\clink_inputrc的内容如下:

set keymap vi

set editing-mode vi
C-l: clear-screen

M-h: backward-char
M-k: history-search-backward
M-j: history-search-forward
M-l: forward-char

重启cmd.exe即可使用clink.exe的键绑定

加载额外的配置

如果想在运行clink之前加载其他的配置文件(比如你希望添加一些环境变量),可以用以下介绍的方法。

假设这个配置文件是%userprofile\.config\cmd_profile.bat里面有需要添加的环境变量,先使用下面的命令来设置cmd.exe的启动配置:

clink autorun set "%userprofile%\.config\cmd_profile.bat"

上面的操作会覆盖原先clink的设置,所以在上面的步骤之后要重新执行:

clink autorun install

搞定!

2021-07-19更新

继续之前加载额外配置的讨论,需要先uninstall,如下所示:

:: clink autorun uninstall
:: clink autorun set %userprofile\.config\cmd_profile.bat
:: clink autorun install

cmd_profile可以设置一个环境变量来避免重复加载:

:: profile for cmd.exe

@echo off

if "%CMD_PROFILE%"=="" (
	set "PATH=%PATH%;C:\Program Files\Git\usr\bin"
	set CMD_PROFILE=1
)

根据Aliases in Windows command prompt, cmd.exe启动时会读取HKEY_CURRENT_USER\Software\Microsoft\Command Processor下的字符串值AutoRun的文件路径作为启动脚本。这里的路径必须是绝对路径,像%USERPROFILE%\alias.cmd这样的是不行的。

如果是Win10的话,可能要换成HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor

下面是一个启动脚本案例:

@echo off

:: Temporary system path at cmd startup

set PATH=%PATH%;"C:\Program Files\Sublime Text 2\"

:: Add to path by command

DOSKEY add_python26=set PATH=%PATH%;"C:\Python26\"
DOSKEY add_python33=set PATH=%PATH%;"C:\Python33\"

:: Commands

DOSKEY ls=dir /B
DOSKEY sublime=sublime_text $*  
    ::sublime_text.exe is name of the executable. By adding a temporary entry to system path, we don't have to write the whole directory anymore.
DOSKEY gsp="C:\Program Files (x86)\Sketchpad5\GSP505en.exe"
DOSKEY alias=notepad %USERPROFILE%\Dropbox\alias.cmd

:: Common directories

DOSKEY dropbox=cd "%USERPROFILE%\Dropbox\$*"
DOSKEY research=cd %USERPROFILE%\Dropbox\Research\

下面是个注册表文件,帮助自动注册此脚本:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="%USERPROFILE%\\alias.cmd"

如果需要指定跨用户的启动脚本,可以将启动脚本路径设为C:\Users\Public\init.cmd,其内容为:

@ECHO OFF
REM Add other configurations as needed
IF EXIST "%USERPROFILE%\alias.cmd" ( CALL "%USERPROFILE%\alias.cmd"

也就是说由这个init.cmd来调用用户特定的alais.cmd。

下面是个注册表文件,帮助自动注册此脚本:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="C:\\Users\\Public\\init.cmd"

如果使用了clink,那么也需要加载clink的脚本,相关的注册表项会显示使用&来拼接两个脚本。

"C:\Users\UserName\.config\cmd_profile.bat"&"C:\Program Files (x86)\clink\0.4.9\clink.bat" inject --autorun --profile ~\clink

(更新完)

2021-11-26更新

clink有了新的开发者https://github.com/chrisant996,且有了更新的版本https://chrisant996.github.io/clink/

新版本和旧版本有一些变化(文档https://chrisant996.github.io/clink/clink.html):

  • readline的配置文件从clink_inputrc变为_inputrc或.inputrc
  • ctrl-c这个行为要通过clink-ctrl-c命令来

在vi模式下配置clink-ctrl-c

set keymap vi-insert

C-c: clink-ctrl-c

# ...

set keymap vi-command

C-c: clink-ctrl-c

# ...

set editing-mode vi

# vim: ft=readline

How do I switch to vi editing mode in readline?介绍了如何切换vi配置。

(更新完)