Windows下使用Emacs的最佳实践
虽说是小技巧可能有点长,以下内容根据我的一条回复扩展而来的。
Windows下使用Emacs的最佳实践就是用MSYS2作为解决方案。安装MSYS2略去不讲,基本使用也不讲,说说和Emacs有关的。
注意此文的写作时间,现在Windows 10流行的情况下,使用WSL或者WSL 2也是一种选择。用WSL折腾肯定少很多,你需要付出的是用Windows 10操作系统和一些磁盘空间。
几个具体问题
1. Git用Windows版的
在/etc/pacman.conf
加入如下内容安装这个版本的Git:
1 | [git-for-windows] |
因为两拨开发者没有合作,所以MSYS2里面没有原生Windows的Git,必须安装这个。
2. Emacs可以用MSYS2仓库里的,也可以自己编译
现在官方有编译指南,是基于MSYS2的,虽然是针对64位的,但也适用于32位。这个指南是在我的编译指南的基础上修改的,现有的指南都是基于我最早的那个指南,有中文版,但有点过时。
3. MSYS2的包管理器是pacman
我见识短,只用过Debian/Ubuntu系列的apt,感觉比那个好多啦。
4. 收发邮件可以用Mew和Wanderlust
Mew配置方法相对简单,但Windows下需要一些hack。Wanderlust配置起来稍微麻烦一点,配置方法可以看我的Wanderlust教程。
5. 用Tramp的正确姿势
Windows平台在*nix系统上运行shell,需要在连接前设置explicit-shell-file-name
为*nix下shell的路径(来源),比如(setq explicit-shell-file-name "/bin/bash")
。或者用类似下面的代码来实现
1 | (let ((default-directory "/sshx:bandwagon:/root/") |
更好的方法是使用Emacs 26.x的特性「连接局部变量」(“Connection Local Variables”),详见我写的优雅的用Tramp从MS-Windows连接到类UNIX系统。
6. 配置字体
因为Emacs的bug,在Windows下用Emacs必须配置字体,否则会卡。配置方法可以看我之前写的Emacs字体设置。
7. 如何启动Emacs
说了半天没介绍怎么启动Emacs,失策。新建一个快捷方式,目标是emacsclientw.exe
的绝对路径后根参数-c -n -a ""
,运行这个快捷方式就可以以daemon模式启动Emacs。各参数的解释:
-c
新建一个frame。这个参数也让emacsclientw
不要求提供文件名。-n
立即退出,对于Windows来说这样就可以。-a ""
这个参数很有意思。-a
的本意是在Emacs没有运行的时候提供一个后退的编辑器,而提供一个空字符串则以daemon模式启动Emacs,这就是我们需要的。注意必须要带空字符串。详解。
8. 配置HOME
在启动Emacs的快捷方式里,还要设置启动位置为%HOME%
,同时在系统的环境变量里为用户或系统添加环境变量HOME
,路径就用MSYS2里你的home目录就可以。
9. 配置PATH
与其依赖系统的环境变量,不如自己设置一个专用于Emacs的。方法是
1 | (setenv "PATH" "C:\\msys64\\mingw64\\bin;C:\\msys64\\usr\\bin;C:\\Windows\\System32;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0") |
注意看路径的写法。
10. 使用*NIX世界的路径表示方法
需要用到cygwin-mount,用包管理器安装就好了,然后用下面三行配置
1 | (require 'cygwin-mount) |
注意这里的路径要改成你电脑上的。这里也看出Windows的一个不好的地方了:不同电脑的目录结构有很大的不同,造成的麻烦远比好处多。
11. 怎么用shell
我现在的做法是,不改shell相关的设置,启动Bash的shell用快捷键实现,如果是运行程序,用代码判断,具体请看两段代码:
1 | (if (string-equal system-type "windows-nt") |
优势和劣势
优势
- 不只针对Emacs,而是模拟了一个*NIX世界。
- 支持的Windows版本广(XP勉强支持,之后的Windows都支持),不强制Win 10。
- 依托社区而非依托商业公司。
- 包管理好用。
- 性能尚可,但应该比不过虚拟机Linux,因为Linux+Emacs有神秘加成😂。
- 植根于Arch Linux的「保持简单」(Keep It Simple, Stupid)的理念,整个系统精简,如果你用过Arch Linux上手很快。
劣势
- 资源占用有点大,大约1 G以上的硬盘空间,但比虚拟机小。
- 体验肯定比不上*NIX世界,说多了都是泪。具体分为以下的几条。
- 因为Windows的路径有盘符(
C:
),而且习惯上使用\
作为路径的分隔,和UNIX世界的习惯/bin/bash
不一样,导致打开文件和运行程序出错,更不用说Emacs中有UNIX的路径了。 - Windows的字体渲染比Linux世界和Mac系列要差很多,而且,因为Windows下Emacs的bug,导致显示中文非常卡。
- 总体来说,Windows没有Linux的那种流畅感,可能是和用户界面的设计有关,可能和键盘重复率限制有关,可能是和程序以及操作系统的API有关,具体原因未知。
- Windows不支持TTY和PTY,只能用管道,使得在Emacs中用shell的功能受到限制,比如term就不能用。
- 很明显,Windows是没有GNU的一套软件的。MSYS2可以解决这个问题,但也存在问题。
- 命令行不能用UTF-8。
- MSYS2的一大缺点是,它的体系是两张皮,一套是Cygwin,依托DLL模拟UNIX环境;一套是MINGW,原生Windows程序。而你用MSYS2就意味着你要同时用这两套系统,复杂度增加,比如PATH设置不好就会导致程序无法启动等。Emacs的开发者Eli就很不喜欢这种方式。
- Windows的进程模式和UNIX的不同,在Windows下启动程序比较昂贵,比如用Magit使用Git时,Windows就会比Linux下慢很多,进程模式不同就是一个原因。
为什么Windows下的Emacs这么慢?
小技巧
- 可以用清华的源加速MSYS2的安装。具体改两个地方就行:
1 | # /etc/pacman.d/mirrorlist.mingw64 |
1 | # /etc/pacman.d/mirrorlist.msys |
第一行注释对应要改的文件。
几句闲话
在Windows下玩Emacs很折腾,也有点浪费生命。事实上,玩Emacs本来就不见得是多么高效的事情。最高效的方式是,什么事都不自己做,当老板指挥别人做(好像有介绍这一观点的书,似乎叫远离电脑还是什么,这个观点在最近我的心得里有讲)。可我们为什么还要折腾Emacs,为什么又要在Windows下用Emacs呢?
因为我高兴。
记住这一点,Happy Hacking,虽然是在有些蹩脚的环境中。
或者您可以把评论发在别处,添加指向本页的连接,然后把网址告诉我:
本文标题:Windows下使用Emacs的最佳实践
文章作者:Chris
发布时间:2017-07-16
最后更新:2022-03-23
原始链接:https://chriszheng.science/2017/07/16/Best-practice-of-Emacs-on-MS-Windows/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!
分享