2011-11-30 74 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