2011-06-30 38 views
8

我的很多工作都涉及搜索和刪除不必要的代碼行。所以我創建一個宏,然後選擇所有行(C-x h),然後運行命令(apply-macro-to-region-lines)。我設法保存該命令並將其放入我的.emacs文件中;我稱之爲cut_it_now。但現在我的功能不再是宏,所以我不能再使用(apply-macro-to-region-lines)功能了。 你知道在某處是否有(apply-function-to-region-lines)emacs中是否存在應用函數到區域的行?

非常感謝,

d

回答

2

我同意@ Lindydancer的回答,並且我還補充說可能有更簡單的方法來實現您的目標。例如內置功能delete-matching-lines。 :-)

+0

感謝sanityinnc! – dola

3

一個簡單的解決方案是定義調用你的函數,然後用好醇」 apply-macro-to-region-lines宏。

除此之外,我認爲你可以在幾行elisp中編寫一個循環,它完全符合你的要求。如果你想要看起來很花哨,你甚至可以提示用戶輸入函數的名字。我認爲這對elisp來說是一個很好的練習,如果你覺得自己想嘗試一下,我可以幫你一些指點。

5

請注意,您仍然可以使用apply-macro-to-region-lines與從代碼生成的宏,提供該宏被定義爲一個向量或字符串。使用自定義apply-named-macro-to-region-lines [2],您可以選擇交互式使用的宏。

Emacs有兩種從鍵盤宏生成代碼的方法,具體取決於用於命名它的方法。

如果使用kmacro-name-last-macro(綁定到C-XC-KÑ),然後Emacs的從宏,這不是用於該特定目的直接有用產生函數 [1]。

如果您使用name-last-kbd-macro來命名您的宏,它將作爲一個向量或字符串生成。

無論哪種情況,您都使用insert-kbd-macro來獲取代碼。實際上,矢量/字符串格式是默認的,因此您可以繞過命名步驟並立即詢問代碼(在名稱提示處鍵入RET以指示最近定義的宏),然後手動編輯插入代碼的默認名稱。

[1]:矢量形式似乎只是嵌入到函數定義中,因此您應該能夠從代碼中提取該函數以手動重新定義矢量格式的宏函數。

[2]:當我最初寫這個回覆時,我忘記了這是一個自定義函數。對於那個很抱歉。

(defun apply-named-macro-to-region-lines (top bottom) 
    "Apply named keyboard macro to all lines in the region." 
    (interactive "r") 
    (let ((macro (intern 
       (completing-read "kbd macro (name): " 
           obarray 
           (lambda (elt) 
            (and (fboundp elt) 
             (or (stringp (symbol-function elt)) 
              (vectorp (symbol-function elt)) 
              (get elt 'kmacro)))) 
           t)))) 
    (apply-macro-to-region-lines top bottom macro))) 
-1

您可以將源總是複製到apply-macro-to-region-lines並調整它來調用函數傳遞,從而使自己的版本。

2

下面的函數應該做你想要什麼:

(defun apply-function-to-region-lines (fn) 
    (interactive "aFunction to apply to lines in region: ") 
    (save-excursion 
    (goto-char (region-end)) 
    (let ((end-marker (copy-marker (point-marker))) 
      next-line-marker) 
     (goto-char (region-beginning)) 
     (if (not (bolp)) 
      (forward-line 1)) 
     (setq next-line-marker (point-marker)) 
     (while (< next-line-marker end-marker) 
     (let ((start nil) 
       (end nil)) 
      (goto-char next-line-marker) 
      (save-excursion 
      (setq start (point)) 
      (forward-line 1) 
      (set-marker next-line-marker (point)) 
      (setq end (point))) 
      (save-excursion 
      (let ((mark-active nil)) 
       (narrow-to-region start end) 
       (funcall fn) 
       (widen))))) 
     (set-marker end-marker nil) 
     (set-marker next-line-marker nil)))) 

所以,如果你有,你想申請對線在緩衝區以下功能:

(defun test() 
    (insert "> ")) 

而且,如果你的緩衝區包含以下內容:

Line 1: blah, blah 
Line 2: blah, blah 
Line 3: blah, blah 
Line 4: blah, blah 

如果您選擇的區域只包含行2 & 3,進入「M-X應用功能對區域的線」,並在提示時輸入「test」作爲函數名,你將得到下面的結果在您的緩衝區:

Line 1: blah, blah 
> Line 2: blah, blah 
> Line 3: blah, blah 
Line 4: blah, blah 
+0

爲什麼你縮小每一行? – ceving

相關問題