如何编写Emacs函数以使用指定文本包装标记的区域

如何编写Emacs函数以使用指定文本包装标记的区域,emacs,function,elisp,Emacs,Function,Elisp,我对elisp不太熟悉,正在努力学习。在emacs中,我希望能够执行以下操作: 通过C-空间标记 转到我希望标记结束的位置,这样我有一个高亮显示的区域,假设它是高亮显示的文本 按键顺序 让emacs让我输入一些文本,比如plot,然后 将突出显示的文本更改为打印突出显示的文本。也就是说,我想用括号将高位文本括起来,然后在前面加上我输入的文本 (defun wrap-text () ) 我想函数的输入应该是突出显示的文本,但我不知道从哪里开始查找。另一个困难的部分是输入文本部分。有人能指

我对elisp不太熟悉,正在努力学习。在emacs中,我希望能够执行以下操作:

通过C-空间标记 转到我希望标记结束的位置,这样我有一个高亮显示的区域,假设它是高亮显示的文本 按键顺序 让emacs让我输入一些文本,比如plot,然后 将突出显示的文本更改为打印突出显示的文本。也就是说,我想用括号将高位文本括起来,然后在前面加上我输入的文本

(defun wrap-text ()
    )

我想函数的输入应该是突出显示的文本,但我不知道从哪里开始查找。另一个困难的部分是输入文本部分。有人能指引我吗?谢谢。

对于您的案例,这应该可以:

(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)

谢谢崔·杰克逊。我不知道你发布了一个解决方案,所以我去freenode上的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会在发布解决方案时通知我。再次感谢。从中进一步了解elisp。

与您的版本更接近,但有一些变化:

可以使用“let”创建局部变量 “区域开始”和“区域结束”为您提供了与trey使用相同的功能 以下是一个例子:

 (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 ")"))))
两个版本之间的另一个区别是调用函数后点的位置;trey版本可能更好地使用口味问题


编辑:根据vinh的评论进行编辑。

这需要“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)))

还有这个问题/答案:。你会怎样对待yasnippet?我熟悉:1。键入关键字2。展开此操作涉及在区域的开头和结尾添加文本。我也想听听这个解决方案。谢谢。@Vinh说得好,你确实需要为yasnippet展开初始文本,我将从答案中删除它。Trey答案中的“交互式”声明是一种更好的方法。“r”表示必须定义一个区域,其余部分用作提示,以便使用标准Emacs方法读取所需文本。虽然这些方法最终可能会像您在这里所做的那样调用read from minibuffer,但您会丢失您自定义的任何其他标准/全局Emacs行为。只是尝试了您的方法,但它不会完全包装文本。包装:wrapmytext。谢谢vinh,你说得对,我的函数只有在你从末尾开始选择要包装的文本时才起作用。我会试着看看能不能解决这个问题。