2011-11-30 23 views
1

我在elisp中是個不錯的選擇,並試圖通過解決我面對的問題來練習,但是這似乎很難。elisp - 圍繞明確定義的文本塊移動

我有具有這種結構

texta 
str1 
textb 
str1 
textc 
str1 
<more times> 
textA 
str2 
textB 
str2 
textC 
str2 
<same number of occurances of str2 as str1> 

現在我想以上STR1的文本,直到前一個STR1(或開頭的第一個被移動到STR2的相應次數,從而產生巨大的緩衝器第一str1和它上面的文字是正確的STR2中第一次出現上述

textA 
texta 
str1 
str2 
textB 
textb 
str1 
str2 
textC 
textc 
str1 
str2 
<etc> 

鑑於elisp的是結合emacs的一起,我認爲它不應該是太硬的人少更多的經驗比我來的語言提供一些解決方案。 ..

回答

3

好的我做到了!

(defun move-under (str1 str2) 
    (interactive) 
    (save-excursion 
    (goto-char (point-min)) 
    (set-mark (point-min)) 
    (search-forward str1) 
    (setq text (buffer-substring (mark) (point))) 
    (delete-region (mark) (point)) 
    (search-forward str2) 
    (backward-delete-char (length str2)) 
    (insert text))) 

(defun rearrange-for-nonbuffer-usage() 
    (interactive) 
(while (search-forward "str2" nil t) 
    (progn (goto-char (point-min)) 
    (move-under "str1" "str2"))))) 
+1

'while'的主體可以有多個表達式,所以你不需要'(progn ...)'包裝器。 – Tyler

1

由於OP表明,這不是太難寫的elisp這一點。但是,如果您將鍵盤宏作爲Emacs工作流程的一部分,這是瞬間的。瞭解更多。

+0

OP是什麼意思? – fakedrake

+0

就是你 - '原創海報'! – Tyler