Emacs: поиск и замена по региону - PullRequest
2 голосов
/ 09 октября 2019

Итак, у меня есть эта превосходная функция (которую кто-то сделал для меня) для выполнения множественного поиска и замены во всем буфере.

(defun accent-replace-whole-buffer ()
  "Corrects macrons from badly scanned latin"
  (interactive "*")
  (dolist (ele (list ?â ?ä ?ê ?ë ?î ?ô ?ü ?ï))
    (setq elt (char-to-string ele))
    (goto-char (point-min))
    (while (search-forward elt nil t 1)
      (replace-match
       (char-to-string
        (pcase ele
          (`?â ?ā)
          (`?ä ?ā)
          (`?ê ?ē)
          (`?ë ?ē)
          (`?î ?ī)
          (`?ô ?ō)     
          (`?ü ?ū)
          (`?ï ?ī)))))))

, и я хотел бы сделать другую функцию, которая делает это,только в выбранном регионе.

Как мне поступить? Есть ли где-нибудь хороший учебник?

Ответы [ 2 ]

4 голосов
/ 09 октября 2019

Использование narrow-to-region, внутри save-restriction:

(defun accent-replace-in-region (begin end)
  "Corrects macrons in active region from badly scanned latin"
  (interactive "*r")
  (save-restriction
    (narrow-to-region begin end)
    (dolist (ele (list ?ā ?ā ?ē ?ē ?ī ?ō ?ū ?ī))
      (setq elt (char-to-string ele))
      (goto-char (point-min))
      (while (search-forward elt nil t 1)
        (replace-match
         (char-to-string
          (pcase ele
            (`?â ?ā)
            (`?ä ?ā)
            (`?ê ?ē)
            (`?ë ?ē)
            (`?î ?ī)
            (`?ô ?ō)     
            (`?ü ?ū)
            (`?ï ?ī))))))))
2 голосов
/ 10 октября 2019

Вместо встроенного интерактивного кода "r", используя эту форму:

(defun MYFUNTION (&optional beg end)
  (interactive "*") 
  (let ((beg (cond (beg)
           ((use-region-p)
            (region-beginning))
           (t (point-min))))
    (end (cond (end (point-marker end))
           ((use-region-p)
            (point-marker (region-end)))
           (t (point-marker (point-max))))))
    (and beg end (narrow-to-region beg end))
    (goto-char beg)
    ;; here some replace example revealing the problem mentioned
    (while (re-search-forward "." end t 1)
      (replace-match "+++++++++"))))

В основном две причины этого: убедитесь, что регион виден при воздействии. «r» не заботится о режиме переходных меток. К сожалению, use-region-p также имеет некоторые причуды. Вторая причина: end необходимо обновить, когда замена изменит длину региона.

...