标记区域和插入前缀

时间:2013-03-21 10:53:43

标签: emacs elisp

我最近从vi切换到emacs,现在我将我最重要的宏移植到emacs。我最需要的是能够在标记的文本区域前加上一个字符串,包括页眉和页脚:

原件:

line 1
line 2
line 3
line 4

在标记第2行和第3行之后,我希望emacs向我询问一个数字,比如002,并执行以下操作,最好记住我的选择:

line 1
*#002# Start:
*$line 2
*$line 3
*#002# End.
line 4

到目前为止,我已设法使用以下代码插入开始和结束标记:

(defun comment-region (start end)
  "Insert COBOL comments."
  (interactive "r")
  (save-excursion 
    (goto-char end) (insert "*#xxx# End.\n")
    (goto-char start) (insert "*#xxx# Start:\n")
    ))

但是,我似乎无法找到如何使用*$为区域中的所有行添加前缀,以及如何使emacs向我询问字符串。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我已经通过动态生成一个来解决这类问题 最近与yasnippet的摘录。

以下是代码:

(require 'yasnippet)
(defun cobol-comment-region (beg end)
  "comment a region as cobol (lines 2,3 commented)

line 1
*#002# Start:
*$line 2
*$line 3
*#002# End.
line 4
"
  (interactive "*r")
  (setq beg (progn
             (goto-char beg)
             (point-at-bol 1))
       end (progn
             (goto-char end)
             (if (bolp)
                 (point)
               (forward-line 1)
               (if (bolp)
                   (point)
                 (insert "\n")
                 (point)))))
  (let* ((str (replace-regexp-in-string
               "^" "*$" (buffer-substring-no-properties beg (1- end))))
         (template (concat "*#${1:002}# Start:\n"
                           str
                           "\n*#$1# End.\n"))
         (yas-indent-line 'fixed))
    (delete-region beg end)
    (yas-expand-snippet template)))

包含视频,??? ???

以下是video的实际操作:

答案 1 :(得分:1)

这是一种更好的方法,但最后有点尴尬......

(defun comment-region (start end prefix)
  "Insert COBOL comments."
  (interactive "r\nsPrefix: ")
  (save-excursion
    (narrow-to-region start end)
    (goto-char (point-min))
    (insert "*#" prefix " #Start.\n")
    (while (not (eobp))
      (insert "*$")
      (forward-line))
    (insert "*#" prefix " #End.\n")
    (widen)))

答案 2 :(得分:1)

最好的办法是使用cobol-mode而不是自己编写临时功能。

文件头包含有关如何使用它的详细说明。

然后只需使用运行命令comment-region C-x C ,它会根据主要模式(在您的情况下为cobol)对区域进行注释。