Есть ли способ написать .emacs, который всегда будет совместим вверх? - PullRequest
6 голосов
/ 18 ноября 2011

Я использую Emacs с версии 18. Emacs Lisp не является моим обычным языком программирования, но несколько лет назад я потратил некоторое время на его изучение, чтобы создать .emacs, который лучше (для меня), чем любая GUI IDE,date.

Это было разовое усилие, и с тех пор я полностью забыл, как программировать на lisp.

Увы, каждый раз, когда я обновляю свой Emacs (18> 19> 20> 21> 22> 23), что-то в моих .emacs ломается, и я трачу слишком много часов (иногда дней) на их исправление.

Во многих других языках, которые я программирую регулярно, можно написать код, которыйникогда не устареет.В emacs, с другой стороны, я никогда не могу предсказать, как все изменится.Например, [M-TAB], который работал до версии 21.4.1, больше не работает в версии 23 и должен быть заменен на "\M-\t".Другой пример - dired-omit-toggle, который раньше работал в версии 21, но перестал работать в версии 22, и его заменили на dired-omit-mode.

Теперь я знаю, что если .emacs мало что делает, это возможнонаписать «почти пустой» .emacs, который (возможно) может оставаться совместимым с будущими версиями.

Но мой .emacs огромен, рассчитан на работу во многих различных операционных системах (и их различных разновидностях, редакциях и версиях).включая системы без графического интерфейса) без единого изменения.Хотелось бы, чтобы был core-API или подмножество, которое гарантированно всегда работало.

Есть ли действительно такой способ написать .emacs, который всегда будет поддерживать восходящую совместимость?

Если так,где я могу найти «кулинарную книгу» или авторитетные рекомендации для достижения этой цели?

Ответы [ 3 ]

6 голосов
/ 18 ноября 2011

Используйте (when (boundp 'some-variable) …) или (when (fboundp 'some-function) …) вокруг любого фрагмента кода, который использует определенную функцию.(Пока вы это делаете, начните с (require 'cl) для тех старых версий, которые не имеют when встроенного.)

Когда все остальное не удается, различайте на emacs-major-version, emacs-minor-versionи running-xemacs (определяется как (string-match "XEmacs\\|Lucid" emacs-version)).

Избегайте синтаксиса и библиотечных функций, которые поддерживаются только в более новых версиях.

Редко что-то ломается, когда вы придерживаетесь документированных интерфейсов.Поэтому постарайтесь найти способ сделать то, что упомянуто в руководстве, и прибегайте к изменению некоторой случайной не настраиваемой переменной, если вы не видите другого пути.По моему опыту, всегда есть достаточно простой способ заставить что-то работать во всех версиях (по крайней мере, с GNU Emacs, XEmacs иногда труднее угодить), если вы допускаете случайные условные выражения.

Например, "\e\t" всегда работал на M-TABdired-omit-mode вернитесь к dired-omit-toggle, если первое не существует:

(set (if boundp 'dired-omit-mode 'dired-omit-mode 'dired-omit-toggle) t)

Да, это немного больно, но не так драматично, как вы это себе представляете.Я поддерживаю .emacs, который работает с чем-либо с 19.23 (IIRC, я давно тестировал с чем-то старше 19.34) на всех DOS, Windows и Unix.Совместимость с Windows на самом деле является большим бременем, чем поспевание за изменениями версии GNU Emacs.

Что касается поваренной книги, то большинство различий между версиями связано с функциями, которые не очень широко используются (в противном случаесопровождающие придают большее значение строгой совместимости вверх).Поскольку Emacs большой, его, несомненно, достаточно, но автор кулинарной книги о нем не слышал.Вам придется играть на слух.К счастью, это не так уж сложно.

4 голосов
/ 18 ноября 2011

Поскольку невозможно предсказать будущие изменения чего-либо, никто не может гарантировать будущую совместимость.

Я думаю, что следующие пункты - это лишь несколько из многих общих способов облегчить поддержку .emacs или init.el (который я сейчас практикую).

  1. поставить .emacs.d / контроль версий (ДОЛЖЕН один)
  2. разбить файл инициализации на несколько маленьких файлов.
  3. используйте when для загрузки определенных настроек для версии emacs.

    например:

    (когда (= emacs-major-version 24)
    ;; загрузить мои настройки на 24
    )

2 голосов
/ 18 ноября 2011

Я сочувствую и разделяю вашу боль. Ответ: нет, такого святого Грааля, боюсь, нет. Как вы сказали, если ваш файл инициализации достаточно прост, вам, возможно, не нужно ничего менять. На самом деле, даже это не так: имя файла инициализации и то, где его ищет Emacs, со временем изменились.

...