Я записал несколько почти идентичных функций, за исключением их имен. Например:
; x is name, such as function/paragraph/line/etc.
(defun my-x-function
(interactive)
(mark-x) (do-more-stuff) (modify-x))
Существует ли способ автоматически генерировать такие функции? У меня есть чувство, что это - то, какие макросы делают, но я не уверен, как использовать их. Любая справка, возможно, включая небольшой пример была бы большой.
Спасибо!
Ага, именно это и делают макросы. Вот простой макрос, который создает функции в соответствии с указанным вами шаблоном:
(defmacro make-my-function (name)
(list 'defun (intern (format "my-%s-function" name)) ()
(list 'interactive)
(list (intern (format "mark-%s" name)))
(list 'do-more-stuff)
(list (intern (format "modify-%s" name)))))
Вы можете скопировать этот макрос в буфер * scratch *
в Emacs и оценить его, а затем проверить, что он работает следующим образом:
(make-my-function x) ; type control-J here
my-x-function ; <-- Emacs's output
(symbol-function 'my-x-function) ; type control-J here
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output
Чаще можно использовать функцию обратных кавычек для более лаконичного написания макросов, но все макросы по существу работают так же, как в приведенном выше примере.
Макросы могут это делать, но есть множество модулей шаблонов для emacs, которые выполняют аналогичную работу. Я использую вещь под названием yasnippet.el для быстрого создания кода. Например, в исходном файле на языке C, если я наберу для
, я получу шаблон цикла for; он позволяет мне заполнить шаблон, задав имя переменной, пределы и содержимое внутреннего цикла.
выглядит так:
Вы можете создавать шаблоны для чего угодно. Определения функций, операторы if, операторы переключения, что угодно. Настройте разные шаблоны для разных режимов. Шаблон для цикла for
в C отличается от шаблона для цикла for
в C # и так далее. Очень кстати.