Emacs 标记区域并插入前缀

Emacs 标记区域并插入前缀,emacs,elisp,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 c

我最近从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向我请求字符串


有什么想法吗?

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

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

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

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

我已经开始通过动态生成 最近的一段

代码如下:

(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)))
包括视频,什么???
下面是一个实例:

我已经开始通过动态生成 最近的一段

代码如下:

(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)))
包括视频,什么??? 下面是一个例子:

您最好的选择是使用它,而不是自己编写特殊函数

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

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

您最好的选择是使用,而不是自己编写特殊函数

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


然后只需使用C-xc,它运行命令
commentregion
,该命令根据主模式(在您的案例中是cobol)对区域进行注释。

commentregion
内置于Emacs中。您正在覆盖一个非常常用的函数。@event_jr:oops,应该先检查一下。谢谢你的提示<代码>注释区域内置于Emacs中。您正在覆盖一个非常常用的函数。@event_jr:oops,应该先检查一下。谢谢你的提示!我错过了一个要求,所以这个答案不太正确。将很快修复。我建议您使用
前一行
而不是
下一行
+
行首
,因为
下一行
对换行和其他显示瑕疵很敏感。您也可以使用
(而不是(eobp))
。我已经忘记了下一行/前进行的区别。和eobp。更新了答案以反映这一点。我错过了一个要求,所以这个答案不太正确。将很快修复。我建议您使用
前一行
而不是
下一行
+
行首
,因为
下一行
对换行和其他显示瑕疵很敏感。您也可以使用
(而不是(eobp))
。我已经忘记了下一行/前进行的区别。和eobp。更新了答案以反映这一点。总的来说,你是对的。然而,我公司的编码指南需要一些特别的努力。COBOL注释仅在第0列中用
*
表示。@Philip:不过,与推出自己的主要模式相比,使用现有COBOL模式来满足特殊要求(例如使用
defadvice
或直接修改代码)更有意义。总的来说,你是对的。然而,我公司的编码指南需要一些特别的努力。COBOL注释仅在第0列中用
*
表示。@Philip:不过,与推出自己的主要模式相比,使用现有COBOL模式来满足特殊要求(例如使用
defadvice
或直接修改代码)更有意义。