在Emacs中替换光标处的字符

3

有没有函数可以在Emacs Lisp中替换特定位置的字符?

目前我能做的是:

(goto-char pt)
(delete-char 1)
(insert c)

这不是通过录制宏最容易实现的吗? - bdecaf
2个回答

1

我认为没有这样的函数,但是你当然可以将上面的内容放在一个defun中。


0

有一些常见的替换,例如切换大小写,将“(”替换为“)”,提高/降低数字。可以使用以下方法完成:

(defun reverse-chars (&optional arg)
  "Reverse reciproke chars as \"[\" to \"]\", upcase or downcase,
Switch `\"' with `''

If over a number, add ARG to it.
With negative arg, substract from number.
Et EOB, look backward for next number. "
  (interactive "*p")
  (let (i done)
    (if (looking-at "[0-9]")
        (ar-add-to-number arg)
      (let* ((cf (char-after))
             (cn (when (char-or-string-p cf)(downcase cf))))
        (cond ((or (eobp)(eq cf 32)(eq cf ?\ ))
               (when (< 0 (abs (skip-chars-backward "^0-9" (line-beginning-position))))
                 (forward-char -1)
                 (ar-add-to-number arg)
                 (setq done t)))
              ((eq cf 34) ;; ?\"
               (setq cn "'"))
              ((eq cf 39) ;; ?\'
               (setq cn "\""))
              ((eq cf 43) ;; ?\+
               (setq cn "-"))
              ((eq cf 62) ;; ?\>
               (setq cn "<"))
              ((eq cf 60) ;; ?\<
               (setq cn ">"))
              ((eq cf 187) ;; ?\»
               (setq cn "«"))
              ((eq cf 171) ;; ?\«
               (setq cn "»"))
              ((eq cf 41) ;; ?\)
               (setq cn "("))
              ((eq cf 40) ;; ?\(
               (setq cn ")"))
              ((eq cf 123)
               (setq cn "}")) 
              ((eq cf 125) 
               (setq cn "{"))
              ((eq cf 93) ;; ?\]
               (setq cn "["))
              ((eq cf 91) ;; ?\[
               (setq cn "]"))
              ((eq cf 45) ;; ?\-
               (setq cn "_"))
              ((eq cf 95) ;; ?\_
               (setq cn "-"))
              ((eq cf 92) ;; ?\\
               (setq cn "/"))
              ((eq cf 47) ;; ?\/
               (setq cn "\\"))
              (t (when (eq cf cn)
                   (setq cn (upcase cf)))))
        (unless done
          (delete-char 1)
          (insert cn))))))

为什么要使用 ((or (eq cf 95)(eq cf ?\_))?第一个 eq 何时会评估为 false,第二个何时会评估为 true? - Cheeso
@Cheeso 说得好,谢谢。将后面的形式改为注释。 - Andreas Röhler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接