方永、南天紫云

道亦有道

为cmd添加readline,如Bash Shell般使用cmd
作者 vinoca 發布於 2013年01月21日

一直以來,就希望能有工具使cmd支持readline的鍵綁定,因爲在Windows下經常使用mintty,時而在cmd中錯輸了readline的快捷鍵,覺得非常的不便,在谷歌裏找過幾次,終於,發現了clink。

clink, Bringing Bash’s powerful command line editing to Microsoft Windows’ cmd.exe

以MIT開源協議發佈,體積也比較小巧。試用之,很好很強大。溢美之詞不再多說,鍵盤控們趕緊去下載吧。

使用也很简单,只要在clink目录下打开一具管理员权限的cmd,运行 clink.bat autorun -i 即可永久与将readline的功能附加到cmd中。实际上,是应用了cmd的一个不常用的功能,即添加cmd自动运行项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor]
"AutoRun"="\"C:\\Program Files\\clink\\clink\" inject"

至于是怎么实现的,clink的说明里有:“将clink的DLL注入到父进程中,并使用钩子函数拦截WriteConsole()和ReadConsole()这两个API函数”。这种方法希望能够通过国内的一些杀软。

个人配置文件,在:

c:\documents and settings\<用户名>\local settings\application data (XP) 
c:\users\<用户名>\appdata\local (Vista 以上版本)

目录中clink_inputrc。可参照clink目录中的clink_inputrc

clink的功能扩展。clink是内置了lua解释器的,将lua脚本放置于clink目录或配置文件所在的目录即能自动执行。clink提供了许多函数,更多参见clink的说明文件。如下面一示例,修改cmd的提示符:

function prompt_filter()
    clink.prompt.value = "^_^ "..clink.prompt.value
    return false
end
 
clink.prompt.register_filter(prompt_filter, 50)