검색시 분음 부호 / 악센트 무시


12

Vim에 검색 할 때 분음 부호 / 악센트를 무시하도록 지시하는 방법이 있습니까? 예를 들어 검색 할 수 있기를 원합니다

kočička

입력하여

/kocicka

ignorecasesmartcase옵션은 매우 유용하지만, 그들은 분음 부호 / 액센트와 함께 할 아무것도하지 않는 것.


답변:


16

주석 에서 언급 한 @muru와 같이 등가 클래스 (에서 설명 됨 :help /[[)를 사용하여 유사한 문자 세트로 평가되는 문자 클래스 표현식 인 것처럼 보입니다 (즉, 악센트 / 발음 구별 부호를 제거하면 동일합니다).

예를 들어, 찾으려면 kočičkakocicka같은 패턴으로, 당신은이를 사용할 수 있습니다 :

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

캐릭터 [[=c=]]의 등가 클래스는 어디에 있습니까 c?


c검색을 수행하는 동안 적중 할 때마다이 문자 클래스를 자동으로 삽입하려면 다음 맵핑을 사용하십시오.

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

다음과 같이 나눌 수 있습니다.

  • <expr> 표현식의 평가를 입력하십시오
  • getcmdtype() =~ '[?/]' 뒤로 또는 앞으로 검색을 작성하는지 테스트
  • '[[=c=]]'c이전 테스트가 성공한 경우 캐릭터 의 동등 클래스를 반환
  • 'c'반환 c그렇지 않으면 문자를

이전 매핑에는 두 가지 단점이 있습니다.

  1. 그것은 단지 c캐릭터를 커버
  2. 패턴을 읽기 어렵게 만들 수 있습니다

다음 <CR>과 같이 다시 매핑하여 향상시킬 수 있습니다 .

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

<CR>검색을 위해 패턴을 작성한 후 적중 하면 매핑은 자동으로 모든 알파벳 문자를 해당 클래스의 대응 문자로 대체합니다.


에 대한 매핑 은 인수가 아닌 시스템 매핑을 사용한다는 점을 제외하고 <CR>는 이전에 대한 매핑과 유사합니다 . 식의 평가를 삽입 할 수 있으며 전체 명령 줄을 식의 평가로 바꿀 수 있습니다.c<expr><C-\>e
<expr><C-\>e


1
또한 /kočičkamatches와 같은 반대 방향으로 가고 싶다면 대신을 kocicka사용할 수 있습니다 . 대안 및 멀티 바이트 문자가 작동하지 않습니다 그러나 (나는 확실하지는 않지만) 효과가있는 것처럼 보이며 자신의 동등성 클래스 (예 :)도 작성하는 것으로 추측 합니다. '[[:lower:][:upper:]]''\a''[:alpha:]''\I''[^[:punct:]]''[А-яЁё]'
kevinlawler

그 설정이 있었으면 좋겠다. [[= c =]]를 사용하는 동안 작동하지만 잘못 입력하면 백 스페이스를 7 번 클릭해야합니다. 가독성도 떨어진다.
daliusd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.