7

Emacs で領域のテキストの大文字と小文字を切り替える (大文字を小文字に、小文字を大文字に切り替える) にはどうすればよいですか?

変換用のコマンドがリストされていますが、切り替え用のコマンドはありません。

例:

MY LETTERケースを切り替えてください

なる必要があります:

私の手紙のケースをトグルしてください

4

5 に答える 5

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))))
于 2013-08-16T08:37:07.410 に答える
1

レターケースを意味する場合、この関数はうまく機能します: http://ergoemacs.org/emacs/modernization_upcase-word.html

(defun toggle-letter-case ()
   "Toggle the letter case of current word or text selection.
   Toggles between: “all lower”, “Init Caps”, “ALL CAPS”."
   (interactive)
   (let (p1 p2 (deactivate-mark nil) (case-fold-search nil))
    (if (region-active-p)
        (setq p1 (region-beginning) p2 (region-end))
      (let ((bds (bounds-of-thing-at-point 'word) ) )
        (setq p1 (car bds) p2 (cdr bds)) ) )
    (when (not (eq last-command this-command))
      (save-excursion
        (goto-char p1)
        (cond
         ((looking-at "[[:lower:]][[:lower:]]") (put this-command 'state "all lower"))
         ((looking-at "[[:upper:]][[:upper:]]") (put this-command 'state "all caps") )
         ((looking-at "[[:upper:]][[:lower:]]") (put this-command 'state "init caps") )
         ((looking-at "[[:lower:]]") (put this-command 'state "all lower"))
         ((looking-at "[[:upper:]]") (put this-command 'state "all caps") )
         (t (put this-command 'state "all lower") ) ) ) )
    (cond
     ((string= "all lower" (get this-command 'state))
      (upcase-initials-region p1 p2) (put this-command 'state "init caps"))
     ((string= "init caps" (get this-command 'state))
      (upcase-region p1 p2) (put this-command 'state "all caps"))
     ((string= "all caps" (get this-command 'state))
      (downcase-region p1 p2) (put this-command 'state "all lower")) )
    ) )
于 2013-08-15T17:10:41.920 に答える