2013-08-15 3 views
6

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

変換のためのリストされたコマンドがありますが、トグルするためのコマンドはありません。

例:

なるはずMY LETTERケース

を切り替えてください:

あなたは大文字小文字を意味する場合、この機能がうまく動作私の手紙のCASE

+1

試行された回答の中には、あなたが実際に求めているものの使用例が見当たらないように見えるので、代わりに別の問題を解決します。私たちの娯楽のためだけに、これがどこに役立つのか説明できますか? – tripleee

+1

これはあまり一般的ではないかもしれませんが、私は誤って(大文字と小文字の文法ファイルで)端末を切り替えて、それらを元に戻すコマンドがあると思っていました。おそらく、マークアップや値などのケースで発生する可能性があります。このようなコマンドがあれば、私は今考えている。それは大文字と小文字の両方に使用できる。 –

答えて

2

私はあなたのために書きました。それは徹底的なテストを持っていませんでしたが、あなたが求めるものを行うように見えます。

ロジックの背後にあるのは、テキスト内のすべての1文字をループすることです。文字が小文字の文字と等しい場合は、それを小文字の戻り文字列に追加します。そうでない場合は、それを小文字で追加します。最後に、リージョンを削除してリターン文字列を挿入します。

これはテキストのページですぐに機能しますが、巨大なテキストには注意が必要です(それでも問題はありません)。

(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)))) 
+0

正常に動作しているようです。 –

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"))) 
    )) 
+0

領域内の各文字の上から下、上から下へ。 –

1

コマンドupcase-regiondowncase-region、およびcapitalize-regionはトグルではなく、おそらくあなたが参照した「変換」コマンドです。それらの間を循環するコマンドがあります。

(defvar cycle-region-capitalization-last 'upper) 
(defun cycle-region-capitalization (&optional msgp) 
    "Cycle the region text among uppercase, lowercase and capitalized (title case)." 
    (interactive "p") 
    (setq cycle-region-capitalization-last 
     (case cycle-region-capitalization-last 
      (upper (call-interactively #'downcase-region) 'lower) 
      (lower (call-interactively #'capitalize-region) 'title) 
      (title (call-interactively #'upcase-region)  'upper))) 
    (when msgp (message "Region is now %scase" cycle-region-capitalization-last))) 
0

私はthis-commandlast-commandを比較する他の回答者の技術、 を言っていますので、私は私の古い機能にそれを取り入れてきました。結果は次のとおりです。

(defun upcase-word-toggle() 
    (interactive) 
    (let ((bounds (bounds-of-thing-at-point 'symbol)) 
     beg end 
     regionp) 
    (if (eq this-command last-command) 
     (setq regionp (get this-command 'regionp)) 
     (put this-command 'regionp nil)) 
    (cond 
     ((or (region-active-p) regionp) 
     (setq beg (region-beginning) 
      end (region-end)) 
     (put this-command 'regionp t)) 
     (bounds 
     (setq beg (car bounds) 
      end (cdr bounds))) 
     (t 
     (setq beg (point) 
      end (1+ beg)))) 
    (save-excursion 
     (goto-char (1- beg)) 
     (and (re-search-forward "[A-Za-z]" end t) 
      (funcall (if (char-upcasep (char-after)) 
         'downcase-region 
         'upcase-region) 
        beg end))))) 

(defun char-upcasep (letter) 
    (eq letter (upcase letter))) 

(global-set-key (kbd "C->") 'upcase-word-toggle) 
+0

コードをテストできません:シンボルの関数定義は無効です:char-upcasep –

7

あなたは正規表現置換でそれを行うことができます:それはこれにキーをバインドするのはあなた次第です

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

+0

交換の最後に余分な括弧がありますが、これは賞を受け取ります –

+1

はい、私はあなたのコメントの直前に気づいた(修正した)。 – angus

関連する問題