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