2013-08-15 66 views
6

Làm cách nào để chuyển đổi chữ hoa chữ thường (chuyển chữ in hoa thành chữ thường và chữ thường thành chữ hoa) của văn bản vùng trong Emacs?Làm thế nào để chuyển đổi các trường hợp chữ cái trong một khu vực trong emacs

Có các lệnh được liệt kê để chuyển đổi nhưng không có gì để chuyển đổi.

Ví dụ:

Xin vui lòng chuyển trường hợp THƯ CỦA TÔI

nên trở thành:

xin vui lòng chuyển TRƯỜNG HỢP lá thư của tôi

+1

Có vẻ như một số câu trả lời đã cố gắng không thấy trường hợp sử dụng cho những gì bạn thực sự yêu cầu, do đó, họ giải quyết một vấn đề khác thay thế. Bạn có thể giải thích điều này sẽ hữu ích ở đâu, nếu chỉ cho vui chơi của chúng tôi? – tripleee

+1

Điều này có thể không quá phổ biến, nhưng tôi đã chuyển trường hợp do nhầm lẫn (thiết bị đầu cuối và không phải thiết bị đầu cuối trong một tệp ngữ pháp) và nghĩ rằng có thể có một lệnh để đảo ngược chúng. Có thể xảy ra có thể với đánh dấu và các giá trị và các trường hợp tương tự. Tôi đang suy nghĩ bây giờ nếu có một lệnh như vậy, nó có thể được sử dụng cho cả upcase và downcase. –

Trả lời

2

Tôi đã viết nó cho bạn; nó không có thử nghiệm kỹ lưỡng, nhưng nó dường như làm những gì bạn tìm kiếm.

Lý do đằng sau nó là lặp qua từng ký tự đơn trong văn bản. Nếu ký tự bằng với ký tự viết hoa, hãy nối nó vào chuỗi trả về trong chữ hoa. Nếu không, hãy thêm nó vào dạng chữ in hoa. Cuối cùng, xóa vùng và chèn chuỗi trả về.

Nó hoạt động ngay trên một trang văn bản, mặc dù tôi rất thận trọng khi sử dụng nó trên các văn bản lớn (nên vẫn ổn).

(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

Dường như hoạt động tốt. –

1

Nếu bạn có nghĩa là chữ hoa, sau đó chức năng này hoạt động độc đáo: 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

Từ trên xuống dưới và từ trên xuống cho mỗi chữ cái trong vùng. –

1

Lệnh upcase-region, downcase-regioncapitalize-region không chuyển đổi và có thể là lệnh "chuyển đổi" mà bạn đã đề cập đến. Đây là một lệnh mà chu kỳ giữa chúng.

(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

tôi thích kỹ thuật câu trả lời khác so sánh this-commandlast-command, vì vậy tôi đã đưa nó vào chức năng cũ của tôi. Đây là kết quả:

(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

Không thể kiểm tra mã của bạn: Định nghĩa chức năng của biểu tượng bị vô hiệu: char-upcasep –

7

Bạn có thể làm điều đó với một regexp thay:

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

Đó là tùy thuộc vào bạn để ràng buộc một chìa khóa để này.

+0

Có một dấu ngoặc kép bổ sung ở cuối thay thế nhưng cái này có giải thưởng –

+1

Có, tôi nhận thấy (và sửa) nó ngay trước khi bình luận của bạn. – angus