elisp - 移动定义明确的文本块

时间:2011-11-30 12:05:46

标签: text emacs elisp edit

我是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绑定在一起的语言,我认为对于没有多少经验的人来说,提出一些解决方案应该太难了......

1 个答案:

答案 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")))))