让emacs变高可移植性绿软——windows部分

Vim、Emacs配置和使用
回复
头像
jobinson99
帖子: 1169
注册时间: 2007-04-28 15:14
系统: NixOS+虚拟机各种系统
联系:

让emacs变高可移植性绿软——windows部分

#1

帖子 jobinson99 » 2013-02-05 21:26

以前一直在linux下用emacs,今天切到windows,想沿用linux下的配置,于是,琢磨了一番。

emacs默认配置在windows的目录是C:/Documents and Settings/water/Application Data
太难找了,改进下,统一放到一个目录下:emacs安装位置所在的site-lisp,把我以前所有配置都放里面,以后可以直接把emacs安装文件夹打包,放到优盘里面即可使用。备份也只需要备份site-lisp文件夹,不用到处找。

最终目录结构如下:

代码: 全选

emacs安装目录:
     | -- bin 启动文件所在
     | -- site-lisp 所有自定义配置所在
     | --  ……  其他文件
     …… 
目前在win xp emacs24测试有效,其他的大家去测试吧。

在解压的emacs目录中,在site-lisp文件夹下,新建一文件 site-start.el,输入如下内容:

代码: 全选

;;设置根目录,init.el和linux下通用

(if (memq window-system '(w32))
    (progn 
      (defvar present-emacs-directory (substring data-directory 0 -4)) ;;找到当前emacs安装目录
      (defvar portable-home-directory (format "%s" (concat present-emacs-directory "site-lisp/"))) ;;设定的新根目录
      (setenv "HOME" portable-home-directory)
      (setenv "PATH" portable-home-directory)
      ))
黑色的不是眼睛,而是眼圈
关注和实现科技领域未来3年内有大规模普及潜力、能改善穷人生活品质的技术/应用。
NixOS + lxqt + 无人生产线 + 无人农场 (已发明全套山地农业机械 + 线性喷洒系统,成片农业采收系统)+ 随身设备,柔性电路,冷热双调衣……
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: 让emacs变高可移植性绿软——windows部分

#2

帖子 月下叹逍遥 » 2013-02-05 22:28

XP。。。
浮生七十今三十,从此凄惶未可知
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: 让emacs变高可移植性绿软——windows部分

#3

帖子 kardinal » 2013-02-05 22:28

设定新的 home 不太好吧, *nix 下site-lisp应该是 755,虽然你说的是 windows 下,但这种不一致终归是不好的
试试这个 https://github.com/ran9er/init.emacs/bl ... otstrap.el
windows 和 *nix 通用
三种加载方式
1.把该文件拷贝为 .emacs 或者 site-start.el
2.在 .emacs 或者 site-start.el 中加载该文件
(load "....../bootstart")
3.指定配置文件夹(*init-dir*)然后加载该文件
[lisp]
(defvar *init-dir*
((lambda (init-name-match base-dir)
((lambda (x) (file-name-as-directory
(or (car (sort x 'file-newer-than-file-p))
(make-temp-name ""))))
(mapcar (lambda (x) (if (file-directory-p x) x (make-temp-name "")))
(directory-files base-dir t init-name-match t))))

"init.*emacs\\|emacs.*init" (apply 'expand-file-name
(cond
((eq system-type 'windows-nt)
`(".." ,exec-directory))
(t
`("~"))))
))

(load (expand-file-name "bootstrap" *init-dir*))
[/lisp]
把所有的配置文件放到 *init-dir*文件夹中,会按顺序加载(只加载 el或者 elc 文件,可以通过改扩展名控制文件是否加载)
*init-dir* 文件夹的位置,在windows中是 emacs 的安装目录下,在*nix中是 HOME 目录下

文件夹的名字包含 init.*emacs 或者 emacs.*init ……为什么这么二逼呢?因为开始的时候我把这个文件夹命名为 emacs.init ,后来觉得不好,改为 init.emacs :em06
又后来发现从github上下载存档,解压后类似 init.emacs-master 、init.emacs-59f00fc79e3383783df66b253f5c954892efe45c这种形式,
为了省略重命名文件夹这一步骤,让它能够识别各种马甲……如果有多个符合要求的文件夹,使用最新的那个;

如果没有符合要求的,使用该文件所在文件夹……也就是说,可以直接把所有配置文件放在HOME中,把该文件改为 .emacs也可以
或者像你那样,把所有文件放在 site-lisp 中,把该文件改为 site-start.el (这种方式不推荐)

当然,给配置文件胡乱起个名字,类似 /x/x/x/x/x.el,而配置文件夹在另外一个地方 /y/y/y/y,这种做法虽然不可取,但仍然是每个公民神圣不可侵犯的权利,这种情况,适用上面第三种加载方式
(defvar *init-dir* "/y/y/y/y")
(load "/x/x/x/x/x.el")
如果配置文件在配置文件夹中,可以直接读取
(load "/x/x/x/x/x/x.el")

这个文件还有一些其它功能,比如:
加载 _autoload_ 文件夹中的 autoload 函数
按需加载 _extensions 文件夹中的文件
自动编译加载为 elc 文件
计算各文件的加载时间
头像
jobinson99
帖子: 1169
注册时间: 2007-04-28 15:14
系统: NixOS+虚拟机各种系统
联系:

Re: 让emacs变高可移植性绿软——windows部分

#4

帖子 jobinson99 » 2013-02-06 22:43

kardinal 写了:设定新的 home 不太好吧, *nix 下site-lisp应该是 755,虽然你说的是 windows 下,但这种不一致终归是不好的
试试这个 https://github.com/ran9er/init.emacs/bl ... otstrap.el
windows 和 *nix 通用
三种加载方式
1.把该文件拷贝为 .emacs 或者 site-start.el
2.在 .emacs 或者 site-start.el 中加载该文件
(load "....../bootstart")
3.指定配置文件夹(*init-dir*)然后加载该文件
[lisp]
(defvar *init-dir*
((lambda (init-name-match base-dir)
((lambda (x) (file-name-as-directory
(or (car (sort x 'file-newer-than-file-p))
(make-temp-name ""))))
(mapcar (lambda (x) (if (file-directory-p x) x (make-temp-name "")))
(directory-files base-dir t init-name-match t))))

"init.*emacs\\|emacs.*init" (apply 'expand-file-name
(cond
((eq system-type 'windows-nt)
`(".." ,exec-directory))
(t
`("~"))))
))

(load (expand-file-name "bootstrap" *init-dir*))
[/lisp]
把所有的配置文件放到 *init-dir*文件夹中,会按顺序加载(只加载 el或者 elc 文件,可以通过改扩展名控制文件是否加载)
*init-dir* 文件夹的位置,在windows中是 emacs 的安装目录下,在*nix中是 HOME 目录下

文件夹的名字包含 init.*emacs 或者 emacs.*init ……为什么这么二逼呢?因为开始的时候我把这个文件夹命名为 emacs.init ,后来觉得不好,改为 init.emacs :em06
又后来发现从github上下载存档,解压后类似 init.emacs-master 、init.emacs-59f00fc79e3383783df66b253f5c954892efe45c这种形式,
为了省略重命名文件夹这一步骤,让它能够识别各种马甲……如果有多个符合要求的文件夹,使用最新的那个;

如果没有符合要求的,使用该文件所在文件夹……也就是说,可以直接把所有配置文件放在HOME中,把该文件改为 .emacs也可以
或者像你那样,把所有文件放在 site-lisp 中,把该文件改为 site-start.el (这种方式不推荐)

当然,给配置文件胡乱起个名字,类似 /x/x/x/x/x.el,而配置文件夹在另外一个地方 /y/y/y/y,这种做法虽然不可取,但仍然是每个公民神圣不可侵犯的权利,这种情况,适用上面第三种加载方式
(defvar *init-dir* "/y/y/y/y")
(load "/x/x/x/x/x.el")
如果配置文件在配置文件夹中,可以直接读取
(load "/x/x/x/x/x/x.el")

这个文件还有一些其它功能,比如:
加载 _autoload_ 文件夹中的 autoload 函数
按需加载 _extensions 文件夹中的文件
自动编译加载为 elc 文件
计算各文件的加载时间
是说可以把linux下的~/.emacs.d的内容直接复制到windows下的 emacs安装目录/site-lisp 里(可以不用.emacs,因为24里,可以把init.el放到~/.emacs.d里面,所以在linux下的配置也只是单一一个文件夹)。
我是这么考虑的:反正windows下的site-lisp文件夹是一定要被自定义的——改home位置需要加site-start.el,干脆所有的自定义的东西都放到这里面了。

另外,你的方法我参考过,比如给配置文件编号,用于顺序加载。初始化我在linux里~/.emacs.d/init.el里有设置(我是设置到~/.emacs.d/config里),这里设置site-start.el要达成的目的是:使得可以把linux下的配置搬过来直接用。
黑色的不是眼睛,而是眼圈
关注和实现科技领域未来3年内有大规模普及潜力、能改善穷人生活品质的技术/应用。
NixOS + lxqt + 无人生产线 + 无人农场 (已发明全套山地农业机械 + 线性喷洒系统,成片农业采收系统)+ 随身设备,柔性电路,冷热双调衣……
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: 让emacs变高可移植性绿软——windows部分

#5

帖子 kardinal » 2013-02-07 2:04

问题不太大……不过如果你用 eshell 的话可能就有点麻烦
因为会继承 emacs 的 HOME PATH 这些变量设置
郁闷的是,windows 下面除了 eshell 基本没有能用的 shell
xfq
帖子: 10
注册时间: 2012-11-03 16:04

Re: 让emacs变高可移植性绿软——windows部分

#6

帖子 xfq » 2013-03-17 15:27

Windows PowerShell...
Lisp
帖子: 11
注册时间: 2013-01-28 10:13

Re: 让emacs变高可移植性绿软——windows部分

#7

帖子 Lisp » 2013-04-20 13:15

你好,我的文件目录是这样的

代码: 全选

Emacs
|--emacs-24.3
|--emacsfiles($HOME)
    |--bin (windows下需要使用的可执行文件,如clang)
    |--etc (模板等一些自己的配置文件)
    |--info (自定义info)
    |--leim (自己使用的输入法)
    |--lisp (插件包)
    |--site-lisp (lisp下的包设置)
    |--.emacs(没使用,都拆分到了site-lisp中)
我的lisp文件夹下的各插件是分开的,也就是lisp下有无数个子文件夹,不然不好控制这些插件的版本,你上面的那个*init-dir*好像是来自Linuxtoy,我看到过。但是不知道能否加载子文件夹下的,子文件...
如不能请使用Emacs中文网ahei的subdirs.el,至于文件的加载顺序可以看,王纯业的"组织 .emacs 的文件内容的技巧"

还有就是,bin下的可执行文件路径设置可以看,李杀网,有相关设置

但是我发现,配置为Portable使用shell存在问题,可能我使用shell较少,如果使用请设置路径。
刚试了下,李杀网的配置,cmd能用了但是其中可能还会出现问题,实在不行就不要设置了$HOME,默认就好...

最后奉上系统判断和版本判断:

代码: 全选

;;; site-start.el --- load site start configuration for GNU Emacs

;; Copyright (C) 2012 Lisp

;; Author: Lisp <@>
;; Maintainer: Lisp <@>
;; Version: 0.1
;; Keywords: if emacs run on windows, maybe it's on USB flash disk

;; This file is part of GNU Emacs.

;;; Commentary:

;;; Code:

;; version:
(defconst site-start-version "0.1")
;; ----------------------------------------------------------------------

;; 通过require-safe重新定义require,加载的文件不存在时不报错
(defmacro require-safe (feature &optional file)
 "*Try to require FEATURE, but don't signal an error if `require' fails."
 `(let ((require-result (require ,feature ,file 'noerror)))
	 (with-current-buffer (get-buffer-create "*Startup Log*")
	  (let* ((startup-log-format-string-prefix "%-30s--------[")
			 (startup-log-format-string-postfix "%s")
			 (startup-status (if require-result "加载成功" "加载失败"))
			 (startup-status-face `(face (:foreground
										  ,(if require-result "green" "red")))))
	   (insert (format startup-log-format-string-prefix ,feature))
	   (let ((start-pos (point)))
		(insert (format startup-log-format-string-postfix startup-status))
		(add-text-properties start-pos (point) startup-status-face)
		(insert "]\n"))))
	 require-result))
;; ----------------------------------------------------------------------

;; 通过when-available重新定义相关函数
(defmacro when-available (func foo)
 "*Do something if FUNCTION is available."
 '(when (fboundp ,func) ,foo))
;; ----------------------------------------------------------------------

;; Environment
(defvar GNUEmacs (string-match "GNU Emacs" (emacs-version))
 "GNU Emacs version")
(defvar XEmacs (string-match "XEmacs" (emacs-version))
 "XEmacs version")
(defvar Linux (string-match "linux" (symbol-name system-type)) 
 "Current operation system is Linux system")
(defvar Microsoft (string-match "windows-nt" (symbol-name system-type))
 "Current operation system is Windows system")
(defvar Windows32 (and Microsoft
				   (not (getenv "PROGRAMW6432")))
 "Current operation system is windows 32bit version")
(defvar Windows64 (and Microsoft
				   (getenv "PROGRAMW6432"))
 "Current operation system is windows 64bit version")


;; Emacs version
(cond
 (GNUEmacs
   (cond
	(Linux
	 (if (file-exists-p "~/.emacs-gnu-linux")
	  (progn
	   (message "正在加载为Linux system定制的GNU Emacs配置!")
	   (load-file "~/.emacs-gnu-linux")))
	)
	(Microsoft
	 ;; 设置为Windows system定制的Emacs便携版
	 (defconst usb-drive-letter (substring data-directory 0 -15))
	 (defconst usb-home-dir (format "%s"(concat usb-drive-letter "emacsfiles/")))
	 (setenv "HOME" usb-home-dir)
	 (setq abbreviated-home-dir nil)
    (setenv "PATH" usb-home-dir)

	 (if (file-exists-p usb-home-dir)
	  (progn
	   (message "正在加载为Windows system定制的GNU Emacs配置!")
	   (load-file "~/site-lisp/utility-configuration.el")))
	)
   )
   (if (file-exists-p "~/.emacs-gnu-all")
	 (progn
	  (message "正在加载为所有Operating system定制的GNU Emacs配置!")
	  (load-file "~/.emacs-gnu-all")))
 ) ; matched GUN Emacs
 (XEmacs
   (cond
	(Linux
	 (if (file-exists-p "~/.emacs-xemacs-linux")
	  (progn
	   (message "正在加载为Linux system定制的XEmacs配置!")
	   (load-file "~/.emacs-xemacs-linux")))
	)
	(Microsoft
	 (if (file-exists-p "~/.emacs-xemacs-linux")
	  (progn
	   (message "正在加载为Windows system定制的XEmacs配置!")
	   (load-file "~/.emacs-xemacs-windows")))
	)
   )
   (if (file-exists-p "~/.emacs-xemacs-all")
	 (progn
	  (message "正在加载为所有Operating system定制的XEmacs配置!")
	  (load-file "~/.emacs-xemacs-all")))
 ) ; matched XEmacs
)
;; ----------------------------------------------------------------------

(if (file-exists-p "~/.emacs-all")
    (progn
     (message "正在加载为所有Emacs和Operation system定制的Emacs配置!")
     (load-file "~/.emacs-all")))

(message "Emacs配置信息加载成功!")
;; ----------------------------------------------------------------------

;; system-configuration
;; 通过string-match从system-configuration检索相关string
;(cond ((string-match "nt" system-configuration)
;	   ... anything special about Windows begins here.
;	  )
;)
;; system-type
;; 通过equal或string-equal比较两个symbol或string是否相等
;(cond ((equal 'windows-nt syste-type)
;       ... anything special about Windows begins here.
;     )
;)
;(cond ((string-equal "windows-nt" syste-type)
;       ... anything special about Windows begins here.
;     )
;)
;; 通过string-match检索symbol-name返回symbol转为string中的string
;(cond ((string-match "windows-nt" (symbol-name system-type))
;	   ... anything special about Windows begins here.
;     )
;)
;; 通过string-match检索prin1-to-string把symbol转为string中的string
;(cond ((string-match "windows-nt" (prin1-to-string system-type))
;	   ... anything special about Windows begins here.
;	  )
;)
;; window-system
;; GUI模式配置
;(cond ((equal window-system 'w32)
;	   ... anything special about Windows gui mode begins here.
;	  )
;)

;; system-name
;; 同一电脑下不同用户的配置
;(cond
; ((string-match "HOMEPC" (system-name))
;  ... anything special about home begins here.
; )
; ((string-match "WORKPC" (system-name))
;  ... anything special about work begins here.
; )
;)
;; ----------------------------------------------------------------------

(provide 'site-start)

;;; site-start.el ends here

;; Local Variables:
;; mode: emacs-lisp
;; coding: utf-8
;; End:
Eastsun
帖子: 389
注册时间: 2010-05-18 14:18

Re: 让emacs变高可移植性绿软——windows部分

#8

帖子 Eastsun » 2013-04-23 0:42

有一个问题,在emacs中使用git的话,emacs的HOME会对git造成影响
两者不一致的话git就找不到配置文件了。
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: 让emacs变高可移植性绿软——windows部分

#9

帖子 kardinal » 2013-04-28 21:07

Lisp 写了: 我的lisp文件夹下的各插件是分开的,也就是lisp下有无数个子文件夹,不然不好控制这些插件的版本,你上面的那个*init-dir*好像是来自Linuxtoy,我看到过。但是不知道能否加载子文件夹下的,子文件...
如不能请使用Emacs中文网ahei的subdirs.el,至于文件的加载顺序可以看,王纯业的"组织 .emacs 的文件内容的技巧"
递归的列出目录下的文件

代码: 全选

(defun xxx (p &optional r)
  (if p
      (xxx (cdr p)
           (append
            r
            (let ((p1 (car p)))
              (if (file-directory-p p1)
                  (xxx (cddr (directory-files p1 t)) '())
                (list p1)))))
    r))

(xxx (cddr (directory-files *init-dir* t)))
因为elisp不支持尾递归优化的因素,上面的这个不太健壮
回复