Napisałem to dla ciebie; nie miał dokładnych testów, ale wydaje się, że robi to, czego szukasz.
Logika za nim polega na zapętleniu każdego znaku w tekście. Jeśli postać jest równa literą w tekście, dołącz ją do łańcucha powrotu w teczce. Jeśli nie, dołącz ją w dół. Na końcu usuń region i wstaw ciąg powrotny.
Natychmiast działa na stronie tekstu, ale uważam, aby nie używać go w dużych tekstach (powinno być nadal w porządku).
(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))))
Wygląda na to, że niektóre z prób odpowiedzi nie pokazują przypadku użycia, o który faktycznie prosisz, więc zamiast tego rozwiązują inny problem. Czy możesz wyjaśnić, gdzie byłoby to przydatne, choćby dla naszej rozrywki? – tripleee
To może nie być zbyt częste, ale przez przypadek zmieniłem przypadek (terminale i nie-terminale w pliku gramatycznym) i pomyślałem, że może istnieć polecenie odwrócenia ich. Może się zdarzyć ze znacznikami i wartościami oraz podobnymi przypadkami. Zastanawiam się teraz, czy istnieje takie polecenie, może ono być używane zarówno dla upcase, jak i downcase. –