2010-06-10 9 views
6

Je ne suis pas sûr si l'utilisation de apply est recommandée ici. Existe-t-il une meilleure solution/standard pour paramétrer dynamiquement le mode majeur? Je n'en ai pas trouvé d'autre.Utilisation correcte de apply dans Emacs Lisp?

Contexte:

Chaque fois que je reçois le message

X has auto save data; consider M-x recover-this-file

dans Emacs, je me demande quelle est la différence entre le fichier en cours et la version auto-save est. Comme la plupart du temps, je ne peux pas être pris la peine de le chercher, j'ai essayé d'automatiser la tâche:

(defun ediff-auto-save() 
    "Ediff current file and its auto-save pendant." 
    (interactive) 
    (let ((auto-file-name (make-auto-save-file-name)) 
     (file-major-mode major-mode)) 
    (ediff-files buffer-file-name auto-file-name) 
    (switch-to-buffer-other-window (file-name-nondirectory auto-file-name)) 
    (apply file-major-mode '()) 
    (other-window 1))) ;; back to ediff panel 

Le code fait ce que je veux, il ouvre le fichier d'enregistrement automatique et commence ediff. Je définis également le mode majeur du fichier d'enregistrement automatique sur le mode principal du fichier d'origine pour un verrouillage cohérent des polices.

+0

Ceci est un morceau d'elisp très pratique, que l'option 'apply' soit le bon choix. – Anne

Répondre

5

Tout appliquer peut certainement être utilisé pour cela, funcall pourrait être mieux

(funcall file-major-mode) 

il diffère de appliquer en ce sens qu'elle ne prend pas une liste d'arguments, seulement les arguments. Les deux éléments suivants sont équivalents:

(funcall '+ 1 2) 
(apply '+ '(1 2)) 
+0

Merci, c'est un bon point. Avec funcall, je n'ai pas besoin d'ajouter cette liste vide comme argument. Semble plus agréable. – lmichelbacher

2

Ça me va bien - c'est pour ça que ça s'applique. D'ailleurs, vous l'avez dit vous-même: le code fait ce que vous voulez! :-)

+0

OK merci. Vouloir seulement vers la perfection, c'est tout;). – lmichelbacher