我是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(或者第一个str1的开头被移动到str2的相应出现,这样第一个str1和它上面的文本就在str2的第一个出现的正上方< / p>
textA
texta
str1
str2
textB
textb
str1
str2
textC
textc
str1
str2
<etc>
鉴于elisp是一种将emacs绑定在一起的语言,我认为对于没有多少经验的人来说,提出一些解决方案应该太难了......
答案 0 :(得分: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")))))