Как написать функцию Emacs, чтобы обернуть отмеченную область указанным текстом - PullRequest
8 голосов
/ 19 ноября 2009

Я не слишком знаком с elisp и пытаюсь учиться. В emacs я бы хотел сделать следующее:

  1. Отметить через C-пробел
  2. Перейдите туда, где я хочу, чтобы маркировка заканчивалась, поэтому у меня выделен регион, предположим, что это «выделенный текст»
  3. Нажмите последовательность клавиш
  4. Пусть emacs попросит меня ввести текст, скажем "plot", и
  5. Измените выделенный текст на «сюжет (выделенный текст)». То есть я хотел бы обернуть выделенный текст в круглые скобки и добавить к нему текст, который я ввел.

    (defun wrap-text ()
        )
    

Полагаю, вводом функции будет выделенный текст, но я не знаю, с чего начать. Другая сложная часть будет входной текстовой частью. Может ли кто-нибудь направить меня? Благодаря.

Ответы [ 4 ]

8 голосов
/ 19 ноября 2009

Для вашего случая это должно работать:

(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)
3 голосов
/ 20 ноября 2009

Что-то немного ближе к вашей версии, но с некоторыми изменениями:

  • вы можете использовать 'let' для создания локальной переменной
  • region-начало и region-end дает вам эквивалент того, что сделал трей с

Вот пример:

 (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 замечания.

2 голосов
/ 19 декабря 2009

это требует '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)))
1 голос
/ 20 ноября 2009

спасибо Трей Джексон. я не знал, что вы опубликовали решение, поэтому я обратился за помощью к #emacs на экране. после некоторого исследования я придумал следующее:

(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 собирается уведомить меня, когда будет опубликовано решение. еще раз спасибо. узнав немного больше об элиспе из этого.

...