2013-03-21 43 views
1

我最近從vi切換到emacs,現在我將最重要的宏移植到emacs。我最需要的是前綴文本標記的區域用字符串的能力,包括頁眉和頁腳:標記區域和插入前綴

原文:

line 1 
line 2 
line 3 
line 4 

標誌着第二和第三個行之後,我想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請求我輸入一個字符串。

任何想法?

+2

'comment-region'內置於Emacs中。你正在覆蓋一個非常常用的功能。 – 2013-03-21 12:21:38

+0

@event_jr:oops,應該先檢查一下。感謝提示! – Philip 2013-03-21 13:57:44

回答

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

我錯過了其中一個要求,所以這個答案並不完全正確。很快就會修復。 – 2013-03-21 12:49:42

+1

我建議你使用'forward-line'而不是'next-line' +'beginning-of-line',因爲'next-line'對線包裹和其他顯示工件很敏感。你也可以使用'(not(eobp))'。 – Stefan 2013-03-21 15:13:53

+0

我忘記了下一線/前線的區別。和eobp。更新了答案以反映這一點。 – 2013-03-21 17:44:01

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

最好的辦法是使用cobol-mode,而不是寫特設功能自己。

文件頭包含有關如何使用它的詳細說明。

就用C-XÇ它運行的命令comment-region,根據主要模式(在你的情況,COBOL)的評論的區域。

+0

一般而言,你是對的。但是,我公司的編碼準則需要一些特殊的努力。 COBOL註釋在第0列中用'*'表示。 – Philip 2013-03-21 13:56:58

+0

@Philip:將現有的cobol模式設置爲符合特殊要求(例如使用「defadvice」或直接對代碼進行修改)比推出自己的主要模式。 – sds 2013-03-21 14:19:09