我最近从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向我询问字符串。
有什么想法吗?
答案 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)对区域进行注释。