Передача данных на пути конструктор или работы метода set, но требует, чтобы создатель команды знал данные потребности команды...
идея "контекста" действительно хороша, и я продолжал работать (внутреннее) платформа, которая усилила ее некоторое время назад.
при установке контроллера (компоненты UI, которые взаимодействуют с пользователем, CLI, интерпретирующий пользовательские команды, интерпретацию сервлета входящие параметры и данные сессии, и т.д.) для обеспечения названный доступом к доступным данным команды могут непосредственно попросить данные, которые они хотят.
мне действительно нравится разделение, которое позволяет установка как это. Думайте о разделении на уровни следующим образом:
User Interface (GUI controls, CLI, etc)
|
[syncs with/gets data]
V
Controller / Presentation Model
| ^
[executes] |
V |
Commands --------> [gets data by name]
|
[updates]
V
Domain Model
, Если Вы делаете правильно, это, те же команды и модель представления могут использоваться с любым типом пользовательского интерфейса.
Взятие этого шаг вперед, "контроллер" в вышеупомянутом довольно универсален. UI управляет только потребностью знать имя из команды, которую они вызовут - у них (или контроллер) не должно быть знания того, как создать ту команду или в каких данных та команда нуждается. Это - реальное преимущество здесь.
, Например, Вы могли держать название команды для выполнения в Карте. Каждый раз, когда компонент "инициирован" (обычно actionPerformed), контроллер ищет название команды, инстанцирует его, вызовы выполняются, и продвигает его на стеке отмены (если Вы используете один).
В вашем случае это должно работать:
(defun wrap-text (b e txt)
"simple wrapper"
(interactive "r\nMEnter text to wrap with: ")
(save-restriction
(narrow-to-region b e)
(goto-char (point-min))
(insert txt)
(insert "(")
(goto-char (point-max))
(insert ")")))
(global-set-key (kbd "C-x M-w") 'wrap-text)
Что-то немного ближе к вашей версии, но с некоторыми изменениями:
Вот пример:
(defun wrap-in-function ()
"Wrap marked region with a specified PREFIX and closing parentheses."
(interactive)
(let ((prefix (read-from-minibuffer "function: ")))
(save-excursion
(goto-char (region-beginning))
(insert (concat prefix "(")))
(save-excursion
(goto-char (region-end))
(insert ")"))))
Еще одно различие между двумя версиями - это положение точки после того, как вы вызвали функцию; Трей-версия может быть лучше для использования (дело вкуса).
РЕДАКТИРОВАТЬ: отредактировал следующие примечания vinh.
спасибо Трей Джексон. Я не знал, что вы опубликовали решение, поэтому обратился за помощью к #emacs на freenode. после некоторого исследования я пришел к следующему:
(defun ess-R-wrap-content-vqn ()
"Wrap marked region with a specified PREFIX and closing parentheses."
(interactive)
(set (make-local-variable 'prefix) (read-from-minibuffer "function: "))
(set (make-local-variable 'prefix) (concat prefix "("))
(save-excursion (goto-char (region-beginning)) (insert prefix))
(save-excursion (goto-char (region-end)) (insert ")"))
)
(define-key ess-mode-map "\C-c\M-w" 'ess-R-wrap-content-vqn) ;; w is for wrap
Я думал, что stackoverflow собирался уведомить меня, когда будет опубликовано решение. еще раз спасибо. узнать немного больше об elisp из этого.
это требует 'cl, но в остальном довольно крошечно. использовал его несколько лет.
(require 'cl) ;;if you haven't elsewhere
(defun decorate-region( beg end prefix suffix )
(interactive "r\nMPrefix: \nMSuffix: ")
(cl-set-buffer-substring beg end (concat prefix
(buffer-substring beg end)
suffix)))