Bỏ qua dấu phụ / dấu khi tìm kiếm


12

Có cách nào để hướng dẫn Vim rằng tôi muốn bỏ qua dấu phụ / dấu khi tìm kiếm không? Ví dụ, tôi muốn có thể tìm kiếm

kočička

bằng cách nhập

/kocicka

Các tùy chọn ignorecasesmartcaserất hữu ích, nhưng dường như chúng không liên quan gì đến dấu phụ / dấu.


3
Liên quan: :h [[=:h patterns-composing.
muru

Câu trả lời:


16

Như @muru đã đề cập trong bình luận , bạn có thể sử dụng một lớp tương đương (được mô tả trong :help /[[) dường như là một biểu thức lớp ký tự được đánh giá là một tập hợp các ký tự tương tự (nghĩa là giống nhau khi bạn xóa bất kỳ dấu / dấu phụ nào).

Ví dụ: để tìm kočičkakocickavới cùng một mẫu, bạn có thể sử dụng:

ko[[=c=]]i[[=c=]]ka

trong đó [[=c=]]lớp tương đương cho cnhân vật.


Để tự động chèn lớp ký tự này bất cứ khi nào bạn nhấn ctrong khi thực hiện tìm kiếm, bạn có thể sử dụng ánh xạ này:

cnoremap <expr> c getcmdtype() =~ '[?/]' ? '[[=c=]]' : 'c'

có thể được chia nhỏ như thế này:

  • <expr> gõ đánh giá của một biểu thức
  • getcmdtype() =~ '[?/]' kiểm tra xem bạn đang viết một tìm kiếm lạc hậu hay chuyển tiếp
  • '[[=c=]]'trả về lớp tương đương cho cký tự nếu thử nghiệm trước đó thành công
  • 'c'trả lại cnhân vật

Ánh xạ trước có 2 nhược điểm:

  1. nó chỉ bao gồm các cnhân vật
  2. nó có thể làm cho mẫu khó đọc

Nó có thể được cải thiện bằng cách ánh xạ lại <CR>như thế này:

cnoremap <CR> <C-\>e getcmdtype() =~ '[?/]' ? substitute(getcmdline(), '\a', '[[=\0=]]', 'g'): getcmdline()<CR><CR>

Khi bạn nhấn <CR>sau khi viết mẫu cho tìm kiếm, ánh xạ sẽ tự động thay thế tất cả các ký tự chữ cái bằng đối tác lớp tương đương của chúng.


Ánh xạ cho <CR>tương tự như ánh xạ trước đó c, ngoại trừ nó không sử dụng đối số <expr>mà là ánh xạ hệ thống <C-\>e.
<expr>cho phép bạn chèn đánh giá của một biểu thức, trong khi <C-\>echo phép bạn thay thế toàn bộ dòng lệnh bằng việc đánh giá một biểu thức.


1
Hơn nữa, nếu bạn muốn đi theo hướng ngược lại, ví dụ: /kočičkakhớp kocicka, thì bạn có thể sử dụng '[[:lower:][:upper:]]'thay vì '\a'. Các lựa chọn thay thế '[:alpha:]''\I'dường như không hoạt động với các ký tự nhiều byte; tuy nhiên, '[^[:punct:]]'dường như hoạt động (mặc dù tôi ít chắc chắn hơn) và tôi cũng đoán là sẽ xây dựng lớp tương đương của riêng bạn (ví dụ, '[А-яЁё]').
kevinlawler

Tôi ước có một thiết lập cho điều đó. Trong khi sử dụng [[= c =]] hoạt động nhưng gõ nhầm có nghĩa là bạn cần nhấp vào backspace 7 lần. Cũng như khả năng đọc cũng bị.
daliusd
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.