如何在emacs中切换区域中的字母大小写

Bas*_*ani 6 emacs elisp

如何切换Emacs中区域文本的字母大小写(将大写字母切换为小写和小写字母为大写)?

列出了转换命令但没有用于切换的命令.

例:

请切换我的信件

应成为:

请仔细阅读我的信件CASE

ang*_*gus 7

您可以使用正则表达式替换来执行此操作:

M-x replace-regexp RET
\([[:upper:]]+\)?\([[:lower:]]+\)? RET
\,(concat (downcase (or \1 "")) (upcase (or \2 ""))) RET
Run Code Online (Sandbox Code Playgroud)

由你来绑定密钥取决于你.


Pas*_*ten 3

我为你写的;它没有经过彻底的测试,但它似乎可以满足您的要求。

其背后的逻辑是循环文本中的每个字符。如果该字符等于小写字符,则将其附加到大写返回字符串中。如果没有,请将其以小写形式附加。最后,删除区域并插入返回字符串。

它可以立即在一页文本上运行,尽管我会谨慎地在大文本上使用它(应该仍然没问题)。

(defun toggle-case ()
  (interactive)
  (when (region-active-p)
    (let ((i 0)
      (return-string "")
      (input (buffer-substring-no-properties (region-beginning) (region-end))))
      (while (< i (- (region-end) (region-beginning)))
    (let ((current-char (substring input i (+ i 1))))
      (if (string= (substring input i (+ i 1)) (downcase (substring input i (+ i 1))))
          (setq return-string
            (concat return-string (upcase (substring input i (+ i 1)))))
        (setq return-string
          (concat return-string (downcase (substring input i (+ i 1)))))))
    (setq i (+ i 1)))
      (delete-region (region-beginning) (region-end))
      (insert return-string))))
Run Code Online (Sandbox Code Playgroud)