Làm thế nào để thực hiện thay thế truy vấn phân biệt chữ hoa chữ thường?


15

Khi tôi làm M-x query-replaceđể thay thế tất cả các lần xuất hiện của vbằng w, sau đó nó cũng phù hợp với V(chữ hoa V). Làm thế nào để buộc emacs chỉ tìm chữ thường v?


"Không phân biệt chữ hoa chữ thường" là hành vi mặc định, trong đó trường hợp không quan trọng trong tìm kiếm. Nếu bạn muốn chỉ khớp một trường hợp, đó là "phân biệt chữ hoa chữ thường" mà bạn muốn. (Tôi cũng có thể bỏ lỡ điều gì đó, vui lòng quay lại chỉnh sửa nếu cần)
T. Verron

@ T.Verron Tôi tin chắc bây giờ, bạn đã đúng.
Tên

Câu trả lời:


13
(customize-set-variable case-fold-search  nil)

Hoặc liên kết biến đó (tùy chọn) trong lệnh của riêng bạn mà chỉ là một trình bao bọc xung quanh query-replace. Điều này có lợi thế là nó không thay đổi giá trị biến cho sử dụng chung, bên ngoài thay thế truy vấn.

Xem thêm biến case-replace, điều khiển trường hợp cho văn bản thay thế.

Xem thêm C-h f query-replace, nơi nó nói, ví dụ:

Kết hợp là độc lập với trường hợp nếu case-fold-searchkhông phải là không và TỪ-CHUINGI không có chữ in hoa. Thay thế chuyển mẫu trường hợp của văn bản cũ sang văn bản mới, nếu case-replacecase-fold-searchkhông phải là số không và TỪ-CHUINGI không có chữ hoa

Xem thêm các ý kiến ​​dưới đây và lỗi Emacs # 20687 , trong đó cho thấy cách bạn có thể vá perform-replaceđể cho phép bạn chuyển đổi trường hợp gấp trong khi query-replace.


Cũng lưu ý rằng mã hiện có cho các perform-replaceliên kết case-fold-searchtheo cách này (lưu ý các biến phụ thuộc vào nó):

(case-fold-search  (if (and case-fold-search search-upper-case)
                       (isearch-no-upper-case-p from-string regexp-flag)
                     case-fold-search))

Thật tốt khi thay đổi case-fold-searchnhanh chóng như chúng ta có thể làm trong quá trình isearchsử dụng M-cràng buộc. Nhưng thật không may query-replace, có bản đồ chế độ của nó.
Kaushal Modi

2
@kaushalmodi: Thông thường, sẽ đơn giản như việc thêm một ràng buộc chính cho điều đó vào query-replace-map: (defun toggle-case () (interactive) (setq case-fold-search (not case-fold-search)))(define-key query-replace-map "C" 'toggle-case). Nhưng việc xử lý các khóa trong bản đồ đó được mã hóa cứng perform-replace. Bạn có thể muốn M-x report-emacs-bug, để perform-replacemã được mở hơn, do đó, các khóa có thể được thêm vào bản đồ. Nó ít nhất nên có một mệnh đề dự phòng chỉ gọi cmd ràng buộc với khóa.
vẽ

Cảm ơn! Không chắc chắn tại sao tôi không tìm thấy query-replace-maptrước đây.
Kaushal Modi

1
Tôi đã nộp mà báo cáo lỗi bây giờ (# 20.687 ). Giải pháp nằm trong báo cáo lỗi đó: Chỉ cần sửa đổi perform-replaceđể thêm một condmệnh đề bổ sung gọi khóa mà bạn đã xác định query-replace-map. Đặt mệnh đề mới ngay trước mệnh đề Catch-all t. Đây là mệnh đề mới : (def (call-interactively def)). Không thể đơn giản hơn.
vẽ

(customize-set-variable case-fold-search nil)đưa ra lỗi customize-set-variable: Attempt to set a constant symbol: nil. Ngoài ra tôi đã thử cả hai (setq case-fold-search nil)(setq case-replace nil)truy vấn vẫn khớp với chữ hoa V.
Tên
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.