对不起,我要回复一个老帖子。看了这个讨论,我给自己的Windows下使用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的。方法是
(setenv "PATH" "C:\\msys64\\mingw64\\bin;C:\\msys64\\usr\\bin;C:\\Windows\\System32;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0")
注意看路径的写法。
10. 使用*NIX世界的路径表示方法
需要用到cygwin-mount,用包管理器安装就好了,然后用下面三行配置
(require 'cygwin-mount)
(setq cygwin-mount-cygwin-bin-directory "C:/msys64/usr/bin/")
(cygwin-mount-activate)
注意这里的路径要改成你电脑上的。这里也看出Windows的一个不好的地方了:不同电脑的目录结构有很大的不同,造成的麻烦远比好处多。
11. 怎么用shell
我现在的做法是,不改shell相关的设置,启动Bash的shell用快捷键实现,如果是运行程序,用代码判断,具体请看两段代码:
(if (string-equal system-type "windows-nt")
(progn
(defun my-bash ()
(interactive)
(let ((shell-file-name "/bin/bash"))
(call-interactively 'shell)))
(global-set-key (kbd "H-s") #'my-bash))
(global-set-key (kbd "H-s") #'shell))
(defun my-hexo-deploy ()
"Deploy my hexo site."
(interactive)
(let ((c "time (cd ~/repo/hexo-blog/; time (hexo g) &>> /tmp/hexo.log; time (hexo d) &>> /tmp/hexo.log;)"))
(async-shell-command
(if (string-equal system-type "windows-nt")
(concat "bash -c "
(shell-quote-argument c))
(shell-quote-argument c)))))
欢迎讨论。