검색에서 첫 번째 일치를 반환하는 방법

Aug 21 2020

vim의 일부 검색 패턴에 대한 내 질문 에 따라 커서 위치를 포함하고 여러 줄인 검색 패턴의 첫 번째 일치 항목 (있는 경우)에 해당하는 텍스트를 얻고 싶습니다 .

다음은 텍스트 예제입니다 (마크 다운 파이썬 셀).

```python
x = 10
```

```python
[p]rint(x)
```

[]커서 높은 게재 순위를 나타냅니다.

내 검색 패턴 :

\(```python\n\)\@<=\%(\%(```\)\@!\_.\)*\%#\_.\{-}\(```\)\@= 

Wich는 텍스트에 해당합니다 print(x).

그래서 기본적으로이 텍스트를 추출하여 vimscript의 변수에 저장하고 싶습니다.

감사합니다.

답변

4 NickSkywalker Aug 22 2020 at 14:26

그래서 나는 그것이 gn내가 필요로하는 것을 발견했습니다 에서 :help gn:

n과 같이 마지막으로 사용한 검색 패턴을 앞으로 검색하고 비주얼 모드를 시작하여 일치하는 항목을 선택하십시오. 커서가 일치 항목에 있으면 시각적으로 선택합니다. 운영자가 보류중인 경우 경기에서 작동합니다.

즉, yank와 결합하여 레지스터의 텍스트를 변수로 가져올 수 있습니다.

그래서 패턴과 일치하는 텍스트를 얻는 함수를 만들었습니다.

function! GetMatch(pattern)
    get matched = search(a:pattern)
    if l:matched
        " save register content
        let savereg = @9
        normal "9ygn
        let match = @9
        " restore register content
        let @9 = l:savereg
    else
        let match = ""
    endif
    return l:match
endfunction

업데이트 : 테스트가없는 다른 버전 :

function! GetMatch(pattern)
    let found = search(a:pattern)
    " save register content
    let savereg = @9
    normal "9ygn
    let match = @9
    " restore register content
    let @9 = l:savereg
    return l:match
endfunction
1 eyalkarni Aug 22 2020 at 05:05

약간 과잉이지만 일치하는 패턴 그룹을 기반으로 파이썬 명령을 실행하는 방법을 참조하십시오 .

패턴 (첫 번째 일치 그룹)을 기반으로 python 명령을 실행할 수 있습니다. 여기에 vim 변수를 설정했습니다.

:%GL/PATTERN/py vim.command("let var='" + match + '"')

일부 이스케이프 문제가 발생할 수 있습니다.