在Cygwin+Mintty下跑Windows的cmd控制台程序

Mon 22 September 2014 / In categories Dev Tools

Cygwin

众所周知,Windows自带的控制台程序cmd.exe对用户不是非常友好,跟Unix下的一系列终端以及shell相比,功能和易用性都相去甚远。

有几个开源项目致力于提高cmd.exe的用户体验:

  • clink为cmd.exe添加向bash那样的命令行编辑和补全功能。
  • cmder是一个功能全面,配置强大的控制台模拟器,集成了msys,git以及clink
  • console2是另一款功能强大的控制台模拟器。

这些模拟器在cmd.exe的基础上添加了多标签页支持、字体设置、拷贝复制、背景设置等等功能。虽然这些改进十分贴心,但大部分都只是界面上的修修改改,并没有将Unix的终端体验完全带入Windows。

要达到Unix上终端的顺畅体验,是需要靠一大堆Unix应用程序支持的。在Windows上,能够基本提供Unix体验的,目前只有Cygwin,Cygwin终端模拟器Mintty也是非常出色,提供强大的功能。

但是Cygwin有一个致命弱点,就是性能太差。整个Unix的编程接口是Cygwin在应用程序级别模拟出来的,而非在内核直接实现。这导致在使用上能明显感觉程序运行速度较慢,特别是涉及文件系统操作的时候。

比如用Cygwin跑一个Python的Web应用,往往这个Web应用需要的启动时间比在Unix下要长久许多。为了克服这个缺点,我们可能希望用Windows原生的Python,而不是用Cygwin下的Python来运行这个Web应用。通常我的做法是在mintty终端里面直接运行cmd.exe,启动控制台,再运行Python,这样可以获得一部分性能的提升。

遗憾的是Mintty对cmd控制台的支持有很多限制,例如无法使用tab补全、命令行历史无法访问等等。一个解决办法是打开新窗口运行cmd.exe:

cygstart cmd.exe

如果使用Tmux和Screen这些终端复用工具,切换Windows窗口这个操作便显得十分麻烦,影响工作流。那有什么办法可以让Mintty对cmd控制台支持得更好呢,Minty的问题跟踪列表里面有一个讨论Issue 56 Improve support for native console programs,里面提供了一个解决方案:使用winpty来为控制台程序作代理。winpty提供了一个程序console.exe:

console.exe cmd.exe

这样,cmd控制台是不是运行得正常多了呢!但还有些小问题没有解决,比如上下左右键无法使用。使用可以解决这个问题,clink模拟了bash的命令行编辑功能,可以使用emacs的键绑定来前后移动:

C-b 往前移一个字符.
C-f 往后移一个字符.

详细的键绑定列表请看库readline的文档。

clink还支持vi模式的键绑定。如果使用可执行文件安装的clink,可以在%USERPROFILE%\AppData\Local\clink目录下创建一个clink_inputrc文件,内容是:

set editing-mode vi

如果使直接解压zip文件安装的clink,clink_inputrc要放在clink目录下面的profile文件夹中。

其他:

  • 为了向Posix兼容Windows自身也提供了类Unix的编程接口,称作Subsystem for UNIX-based Applications (SUA)。
  • shell-terminal提供了和Winpty的类似功能。
Load Disqus Comments