2009-03-24 33 views
44

Mỗi một lần trong một thời gian tôi muốn thay thế tất cả các trường hợp của các giá trị như:Emacs: biểu hiện thường xuyên thay thế để thay đổi trường hợp

<BarFoo> 

với

<barfoo> 

tức là làm thay thế một biểu thức chính quy của tất cả mọi thứ bên trong các dấu ngoặc nhọn với chữ thường tương đương.

Bất kỳ ai cũng có một đoạn trích ngắn của Lisp thực hiện việc này? Có thể giả định rằng chúng ta đang xử lý chỉ các giá trị ASCII. Điểm thưởng cho bất kỳ thứ gì đủ chung chung để có biểu thức chính quy đầy đủ và không chỉ xử lý ví dụ về góc ngoặc. Thậm chí nhiều điểm thưởng cho câu trả lời chỉ sử dụng M-x query-replace-regexp.

Cảm ơn,

Dom

Trả lời

64

Hãy thử M-x query-replace-regexp với "<\([^>]+\)>" như chuỗi tìm kiếm và "<\,(downcase \1)>" như sự thay thế.

Điều này sẽ hoạt động cho Emacs 22 trở lên, xem chi tiết này Steve Yegge blog post để biết thêm chi tiết về cách biểu thức Lisp có thể được sử dụng trong chuỗi thay thế.

Đối với phiên bản trước của Emacs bạn có thể thử một cái gì đó như thế này:

(defun tags-to-lower-case() 
    (interactive) 
    (save-excursion 
    (goto-char (point-min)) 
    (while (re-search-forward "<[^>]+>" nil t) 
     (replace-match (downcase (match-string 0)) t)))) 
+6

Đó là mát mẻ! Tôi không biết \,() trong biểu thức chính quy của Emacs. – emk

+1

Điều này cho tôi lỗi "Sử dụng không hợp lệ' \ 'trong văn bản thay thế " –

+1

Regexp phải là" <\\([^>] + \\)> "và thay thế không hoạt động như mong đợi nếu chuỗi tìm kiếm khớp với thẻ trong tất cả các chữ cái. –

Các vấn đề liên quan