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

时间:2009-11-19 04:47:51

标签: emacs function elisp

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

  1. 通过C-space标记
  2. 转到我希望标记结束的位置,因此我有一个突出显示的区域,假设它是“突出显示的文本”
  3. 按键序列
  4. 让emacs让我输入一些文字,说“情节”和
  5. 将突出显示的文本更改为“情节(突出显示的文字)”。也就是说,我想用括号括起highlited文本,并在它前面添加我输入的文本。

    (defun wrap-text ()
        )
    
  6. 我认为函数的输入是突出显示的文本,但我不知道从哪里开始查找。另一个难点是输入文本部分。有人可以指导我吗?感谢。

4 个答案:

答案 0 :(得分:8)

对于您的情况,这应该有效:

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

答案 1 :(得分:3)

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

  • 您可以使用'let'创建本地变量
  • region-beginning和region-end为您提供了相同的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评论进行编辑。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

谢谢trey jackson。我不知道你发布了一个解决方案,所以我去了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。