在emacs中,如何替换文本块中的所有重音?

在emacs中,如何替换文本块中的所有重音?,emacs,Emacs,假设我有: “所有人都有自己的权利,有自己的权利,有自己的权利,有自己的权利,有自己的权利,有自己的权利。” 但是我想要 “这是一个好消息,是一个好消息,是一个好消息,一个好消息,一个好消息,一个好消息,一个好消息,一个好消息。” 即–ä->ā等->ē等 我认为一个大键盘宏可以进行大量搜索和替换,但有没有更好的方法?在许多情况下,编写Emacs lisp函数而不是存储kbd宏等可以节省大量时间。Emacs配备了优秀的调试工具。例如,使用下面的解决方案在您的示例中调用M-x edebug eval

假设我有:

“所有人都有自己的权利,有自己的权利,有自己的权利,有自己的权利,有自己的权利,有自己的权利。”

但是我想要

“这是一个好消息,是一个好消息,是一个好消息,一个好消息,一个好消息,一个好消息,一个好消息,一个好消息。”

即–ä->ā等->ē等


我认为一个大键盘宏可以进行大量搜索和替换,但有没有更好的方法?

在许多情况下,编写Emacs lisp函数而不是存储kbd宏等可以节省大量时间。Emacs配备了优秀的调试工具。例如,使用下面的解决方案在您的示例中调用M-x edebug eval顶级表单RET:

(defun accent-replace ()
  "Does what I want"
  (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
      (`?â ?ā)
      (`?ä ?ā)
      (`?ê ?ē)
      (`?ë ?ē)
      (`?î ?ī)
      (`?ô ?ō)))))))

受这些评论的启发,我提出了以下交互式命令:

(defun tr (from to beg end)
  "Replace each character in FROM with the character at the same position in TO.
Operates from BEG to END, or within the marked region if called interactively.

If TO is shorter than FROM, any characters in FROM beyond the length of TO are
just deleted."
  (interactive "sTranslate from: \nsTranslate to: \nr")
  (goto-char beg)
  (setq end (copy-marker end))
  (let ((regexp (regexp-opt (mapcar 'string from))))
    (while (search-forward-regexp regexp end t)
      (let* ((index (cl-search (match-string 0) from))
             (replace-with (if (> (1+ index) (length to))
                               ""
                             (substring to index (1+ index)))))
        (setf (buffer-substring (match-beginning 0) (match-end 0)) replace-with)))))

标记包含文本的区域,调用M-x tr,并将“-ëëëëëëë作为第一个字符串,将āëëëëëëëëëë作为第二个字符串。

但我只需选择文本,并在区域M-|上使用shell命令,并。