2

最近、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 に文字列を要求させる方法を見つけることができないようです。

何か案は?

4

3 に答える 3

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

ビデオが含まれています、何ですか?

これが実際の動作のビデオです。

于 2013-03-21T13:18:22.577 に答える
1

最善の策は、アドホック関数を自分で作成する代わりに、cobol-modeを使用することです。

ファイルのヘッダーには、使用方法に関する詳細な手順が含まれています。

次に、メジャーモード(あなたの場合はcobol)に従ってリージョンをコメントするC-x Cコマンドを実行するだけです。comment-region

于 2013-03-21T13:47:53.930 に答える
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)))
于 2013-03-21T12:17:07.087 に答える