Делиться конфигурацией 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))

и т.п.

Другие вопросы по тегам