Windows 下如何为 Emacs 设置环境变量?

对不起,我要回复一个老帖子。看了这个讨论,我给自己的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)))))

欢迎讨论。

1 个赞