Как я могу узнать, какая версия emacs представила функцию? - PullRequest
2 голосов
/ 22 марта 2010

Я хочу написать .emacs, который использует как можно больше основных функций emacs, изящно отступая при запуске под предыдущими версиями. Я нашел методом проб и ошибок некоторые функции, которые не существовали, например, в emacs 22, но теперь делают в emacs 23 в редком случае, когда я заканчивал тем, что запускал свои точечные файлы под emacs 22 Однако я бы хотел использовать более проактивный подход и иметь подмножества моих точечных файлов, которые вступают в силу только при версии> = <some-threshold> (например). Сейчас я сосредоточен на функции scroll-bar-mode, но мне нужно общее решение.

Я не видел постоянного источника этой информации; Я проверил онлайн-документы по gnu.org, сам код функции и пока ничего. Как я могу определить это, не сохраняя каждую версию emacs, которую я хочу поддерживать,?

Ответы [ 3 ]

2 голосов
/ 22 марта 2010

Я не могу ответить на ваш вопрос напрямую, но я использую одну технику, чтобы проверить функцию functionp, которая сообщает мне, существует ли функция.

, например

(if (load "completion" t)
  (progn
    (initialize-completions)
    (if (functionp 'dynamic-completion-mode)
      (dynamic-completion-mode) ; if exists
      (completion-mode)         ; otherwise use old version
    )
  ) ; progn
) ; if

обновление : добавление макросов для конкретной версии

В дополнение к использованию functionp у меня также есть некоторые макросы для конкретной версии:

(defmacro GNU_EMACS_21 (&rest stuff)
   (list 'if (string-match "GNU Emacs 21" (emacs-version)) (cons 'progn stuff)))
(defmacro GNU_EMACS_20 (&rest stuff)
  (list 'if (string-match "GNU Emacs 20" (emacs-version)) (cons 'progn stuff)))
(defmacro GNU_EMACS_19 (&rest stuff)
  (list 'if (string-match "GNU Emacs 19" (emacs-version)) (cons 'progn stuff))) 
(defmacro WINSYS_X (&rest stuff)
  (list 'if (eq window-system 'x) (cons 'progn stuff)))
(defmacro WINSYS_W32 (&rest stuff)
  (list 'if (eq window-system 'w32) (cons 'progn stuff)))
(defmacro WINSYS_NIL (&rest stuff)
  (list 'if (eq window-system nil) (cons 'progn stuff)))
(defmacro SYSTYPE_LINUX (&rest stuff)
  (list 'if (string-match "linux" (symbol-name system-type)) (cons 'progn stuff)))

Затем я могу использовать это:

(GNU_EMACS_21
  (if (load "cua" t)
    (CUA-mode t)
  )
)
(WINSYS_NIL ; when running in text mode
  (push (cons 'foreground-color "white") default-frame-alist)
  (push (cons 'background-color "black") default-frame-alist)
  (push (cons 'cursor-color "cyan") default-frame-alist)
  (push (cons 'minibuffer t) default-frame-alist)
)

Полагаю, вы уже знаете это; и на такие вопросы, как "когда режим CUA включается в Emacs" трудно ответить ..

0 голосов
/ 21 августа 2011

Обычно лучше проверить существование функции или переменной, которую вы хотите использовать, а не тестировать версию Emacs. Например, используйте fboundp и boundp. Иногда имеет смысл проверить featurep, но там снова лучше использовать fboundp или boundp.

0 голосов
/ 22 марта 2010

Файлы «NEWS» (доступные через C-h N) могут давать подсказки о том, когда были введены функции.

...