'로 검색을 시작 했는데도 어떻게'n '을 진행할 수 있습니까? 또는 '#'?


19

Vim에는 반대 방향으로 검색하는 두 가지 명령 세트가 있습니다. /패턴을 입력 하면 문서에서 패턴을 검색합니다. 입력 ?하면 패턴이 뒤로 검색됩니다. *#명령 사이에 동일한 관계가 있습니다 .

내가 싫어하는 것은 이러한 명령이 nN명령 의 검색 방향을 설정한다는 것입니다 . 사용 후 /, n문서 앞으로 이동하고 N뒤로 이동; 사용 후 ?, n후방으로 이동하고 N전방으로 진행한다. 즉, n항상 원래 검색과 같은 방향으로 N가고 항상 다른 방향으로갑니다.

어떻게 얻을 수있는 n문서 앞으로 이동하고, N관계없이 내가에서 검색을 시작하는 방향, 뒤로 이동?

답변:


29

당신의 동작을 변경할 수 있습니다 nN위쪽으로 다음과 useing로 / 지속적으로 아래로 검색 :

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

업데이트 : 어떻게 작동합니까?

표현식 맵을 사용합니다.이 맵은 lh가 발생할 때마다 맵의 lhs를 평가할 식에 매핑합니다. :h map-expression도움말을 참조하십시오 .

v : searchforward 변수 (마지막 검색의 내부 상태를 결정하는 참조 :h v:searchforward)는 앞에있는 문자열의 인덱스로 사용됩니다. 따라서 첫 번째지도의 경우 마지막 검색 방향이 앞으로 인 경우 n은 'n'(인덱스 1, 두 번째 문자를 반환 함)에 매핑되고 뒤로 인 경우 'n'은 'N'(v : searchforward 변수가 0이기 때문에 'N'이 리턴됩니다.

이러한 맵을 작성하는 다른 방법은 다음과 같습니다 (더 명확 할 수 있음).

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

또한이를 수행하는 플러그인도 있습니다 (예 : SearchRepeat 플러그인 및 기타 플러그인 ).


플러그인을 언급 해 주셔서 감사합니다. 나는 단지 대안으로서 그것을 추천하려고했다 :-)
Ingo Karkat

2
아래 첨자를 영리하게 사용하십시오!
wchargin

6
설명을 추가해 주시겠습니까? 나는이 구문을 전에 보지 못했고 그것이 어떻게 작동하는지 알고 싶습니다.
EvergreenTree

1
@EvergreenTree : 추가 설명 추가
Christian Brabandt

2
@ChristianBrabandt 매우 영리합니다. 난 당신 v:searchforward이 색인으로 사용 생각하지 않았다 .
EvergreenTree

1

Christian Brabandt의 솔루션을 기반으로

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

이러한 매핑은 foldopen설정을 따릅니다.


0

SearchIndex 플러그인을 사용하고 있습니다. Christian Brabandt의 답변을 사용하지만 입력 할 때마다 일치 번호를 표시하는 플러그인 기능을 유지하려면 n또는 N이것을 vimrc에 넣습니다.

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.