2013-06-11 7 views
5

Sto provando a mettere tutta la configurazione di emacs sotto controllo di versione per passare facilmente da un computer all'altro. In realtà il mio sistema preferito è OSX (10.8.3) con emacs 24.3 da http://emacsformacosx.com/. Ma posso anche lavorare in altri sistemi (più probabilmente basati su linux anche se con diversa distribuzione ubuntu/scientific-linux) che generalmente sono equipaggiati con emacs 23.4. Quello che mi piacerebbe avere è un file init che controlla la versione di emacs e il sistema operativo, carica i pacchetti necessari da emacs package manager. Finora il mio .emacs init istanza di emacs 24.3 su OSX è la seguentecondivide la configurazione di emacs tra emacs 23 ed emacs 24

(require 'package) 
(setq package-archives '(
    ("marmalade" . "http://marmalade-repo.org/packages/") 
    ("org" . "http://orgmode.org/elpa/") 
    ("melpa" . "http://melpa.milkbox.net/packages/"))) 
(package-initialize) 

dopo che ci sono di configurazione (caricati separatamente come ad esempio

(load "python-sy") 

che utilizza alcuni pacchetti non installati di default: in particolare

color-theme 
org-mode 
theme-changer 
ess-site 
magit 
auctex 
python.el (fgallina implementation) 

più alcune altre cose che si basa in confezioni già incorporati ammetto che non ho idea su ho w per iniziare con un file init .emacs che potrebbe essere usato indifferentemente su tutti i dispositivi. Inoltre mi piacerebbe anche avere un modo per caricare-servizi url-proxy in base alla configurazione del sistema

(setq url-proxy-services '(("http" . "proxy.server.com:8080"))) 

Grazie per tutto l'aiuto

+0

È possibile ottenere una versione di 'package.el' per Emacs 23; segui il link sulla pagina [ELPA EmacsWiki] (http://www.emacswiki.org/emacs/ELPA). (Assicurati di spostarlo se/quando i sistemi in questione vengono aggiornati su Emacs 24.) – legoscia

risposta

4

variabili rilevanti sono system-type e emacs-major-version. Si può usare qualcosa come il seguente

(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 
)) 
1

Insieme a risposta giornado, si può anche mettere le impostazioni specifiche del pacchetto in un modo in cui saranno valutati solo quando il pacchetto è presente per la verifica del risultato (require). Esempio con il pacchetto bbdb:

(when (require 'bbdb nil t) 
    (progn ...put your (setq) and other stuff here...)) 
+0

Non è "eval-after-load' meglio? Ciò riduce leggermente il tempo di avvio ed esegue il codice solo quando necessario. – giordano

+0

Caro Giordano puoi farmi un esempio dell'uso di eval-after-load? –

+2

@giordano: 'eval-after-load' consente di eseguire il codice solo se si carica un pacchetto. Nel mio esempio ci sono più pacchetti che voglio caricare all'avvio, ma senza avere un errore se il pacchetto non è presente (ho usato per condividere il mio '.emacs' tra un host Linux, un host Windows e un Mac, e non tutti gli stessi pacchetti sono stati installati in ciascuno). – Seki

0

Per questa situazione io definisco alcune costanti nella parte superiore del .emacs: utilizzo

(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))) 

Esempio:

(when --emacs24p 
    (require 'epa-file) 
    (epa-file-enable) 
    (setq epa-file-cache-passphrase-for-symmetric-encryption t) ; default is nil 
    ) 

Oppure:

(if --emacs22p 
     (c-toggle-auto-newline 1) 
    (c-toggle-auto-state 1)) 

ecc.