【问题标题】:Mark region and insert prefix标记区域并插入前缀
【发布时间】:2013-03-22 01:42:37
【问题描述】:

我最近从 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 向我询问字符串。

有什么想法吗?

【问题讨论】:

  • comment-region 内置在 Emacs 中。您正在覆盖一个非常常用的函数。
  • @event_jr:哎呀,应该先检查一下。感谢您的提示!

标签: emacs elisp


【解决方案1】:

我已经开始通过动态生成 最近与yasnippet sn-p。

代码如下:

(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 正在运行:

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 总的来说,你是对的。但是,我公司的编码指南需要一些特别的努力。 COBOL 注释在第 0 列中简单地由 * 表示。
    • @Philip:使用现有的 cobol 模式来满足特殊要求(例如,使用 defadvice 或直接修改代码)比推出自己的专业更有意义模式。
    【解决方案3】:

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

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

    【讨论】:

    • 我错过了一项要求,所以这个答案不太正确。很快就会修复。
    • 我建议您使用forward-line 而不是next-line+beginning-of-line,因为next-line 对换行和其他显示伪影很敏感。您也可以使用(not (eobp))
    • 我忘记了下一行/前行的区别。和 eobp。更新了答案以反映这一点。
    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2019-04-17
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多