Emacs 标记区域并插入前缀
我最近从vi切换到emacs,现在我正在将我最重要的宏移植到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
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
或直接修改代码)更有意义。