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配置。
(更新完)