Делиться конфигурацией emacs между emacs 23 и emacs 24
Я пытаюсь поставить всю свою конфигурацию emacs под контроль версий, чтобы легко переключаться между разными компьютерами. На самом деле моя предпочтительная система - OSX (10.8.3) с emacs 24.3 от http://emacsformacosx.com/. Но я также могу работать в других системах (более вероятно, на основе linux, но в другом дистрибутиве ubuntu/ Scientific-Linux), которые обычно оснащены emacs 23.4. Я хотел бы иметь файл инициализации, который проверяет версию emacs и операционной системы, загружает необходимые пакеты из менеджера пакетов emacs. Пока что мой.emacs init файл для emacs 24.3 на OSX выглядит следующим образом
(require 'package)
(setq package-archives '(
("marmalade" . "http://marmalade-repo.org/packages/")
("org" . "http://orgmode.org/elpa/")
("melpa" . "http://melpa.milkbox.net/packages/")))
(package-initialize)
После этого идут настройки (загружаются отдельно как например
(load "python-sy")
который использует некоторые пакеты, не установленные по умолчанию: в частности
color-theme
org-mode
theme-changer
ess-site
magit
auctex
python.el (fgallina implementation)
плюс некоторые другие вещи, которые зависят от уже встроенных пакетов, я признаю, что понятия не имею, с чего начать, чтобы иметь файл инициализации.emacs, который можно было бы безразлично использовать на всех устройствах. Кроме того, я также хотел бы иметь возможность загружать url-proxy-сервисы в зависимости от конфигурации системы.
(setq url-proxy-services '(("http" . "proxy.server.com:8080")))
Спасибо за любую помощь
3 ответа
Соответствующие переменные system-type
а также emacs-major-version
, Вы можете использовать что-то вроде следующего
(if (>= emacs-major-version 24)
(progn
;; Do something for Emacs 24 or later
)
;; Do something else for Emacs 23 or less
)
(cond
((eq system-type 'windows-nt)
;; Do something on Windows NT
)
((eq system-type 'darwind)
;; Do something on MAC OS
)
((eq system-type 'gnu/linux)
;; Do something on GNU/Linux
)
;; ...
(t
;; Do something in any other case
))
Наряду с ответом giornado, вы также можете настроить параметры вашего пакета так, чтобы они оценивались только тогда, когда пакет присутствует, проверяя (require)
результат. Пример с bbdb
пакет:
(when (require 'bbdb nil t)
(progn ...put your (setq) and other stuff here... ))
Для этой ситуации я определяю несколько констант в верхней части .emacs:
(defconst --xemacsp (featurep 'xemacs) "Is this XEmacs?")
(defconst --emacs24p (and (not --xemacsp) (>= emacs-major-version 24)))
(defconst --emacs23p (and (not --xemacsp) (>= emacs-major-version 23)))
(defconst --emacs22p (and (not --xemacsp) (>= emacs-major-version 22)))
(defconst --emacs21p (and (not --xemacsp) (>= emacs-major-version 21)))
Пример использования:
(when --emacs24p
(require 'epa-file)
(epa-file-enable)
(setq epa-file-cache-passphrase-for-symmetric-encryption t) ; default is nil
)
Или же:
(if --emacs22p
(c-toggle-auto-newline 1)
(c-toggle-auto-state 1))
и т.п.