elisp - перемещение по четко определенным блокам текста - PullRequest
1 голос
/ 30 ноября 2011

Я довольно новичок в 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, я думаю, что для человека с немного большим опытом, чем я, не должно быть слишком сложно найти какое-то решение ...

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

хорошо, я сделал это!

(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 голос
/ 30 ноября 2011

Как показал OP, написать Elisp для этого не сложно. Однако, это мгновенно, если у вас есть клавиатурные макросы как часть вашего рабочего процесса Emacs. Посмотри на это.

...