Vim에서 열린 모든 탭에서 현재 단어를 검색하는 방법은 무엇입니까?


16

커서를 사용하여 현재 단어 위에 *#를 사용하여 Vim 단어 검색을 배우기 시작했습니다 . 그러나이 검색은 현재 파일 버퍼로 제한됩니다.

이 검색을 확장 할 수있는 명령 또는 바로 가기가 있습니까?

  1. 모든 열린 탭?
  2. 모든 열린 버퍼?

1
탭 대 버퍼에 대한 이 설명은 흥미롭고 도움 될 수 있습니다 .
와일드 카드

답변:


4

귀하의 문제에 대한 정확한 해결책이 없습니다. 그러나 이것이 모든 버퍼에서 단어를 찾는 문제를 해결하는 방법입니다.

" enables to search in all open buffers with :Search <pattern>
command! -nargs=1 Search call setqflist([]) | silent bufdo grepadd! <args> %

nnoremap <left>  :cprev<cr>zvzz
nnoremap <right> :cnext<cr>zvzz

첫 번째 행은 Search검색 패턴을 인수로 사용하여 명령 을 작성하여 결과를 빠른 수정 사항 목록에 작성합니다. 다른 두 줄은 (적어도 나를 위해) 쓸모없는 화살표 키를 유용한 것으로 매핑합니다. 그것들은 다음 / 이전 검색 또는 다음 / 이전 컴파일 오류 등으로 점프하도록 매핑되며, 단순히 퀵 픽스 목록을 통해 단계적으로 진행됩니다. 다음과 같이 사용할 수 있습니다.

:Search foobar
<right>
<right>
…

나는이 명령을 좋아하지만 몇 가지를 추가하여 검색어를 더 잘 탈출하고 강제로 다시 그립니다. (스플릿과 함께 침묵을 사용하면 vim ui가 버그를 일으킬 수 있습니다). 명령! -nargs = 1 검색 호출 setqflist ([]) | 자동 실행 "bufdo grepadd! '<args>'%"| 다시 그리기!
Igorio

다음 문서를 입력 :cn하거나 :cp전환 할 수도 있습니다.
phyatt

7

실제로 알아볼 수는 없지만 기본 동작입니다. *다른 탭으로 변경하고 명령 모드에서 nans N를 사용 하여 검색 적중 사이를 앞뒤로 이동하십시오.

먼저 모든 적중에 대해 강조 표시를 켜면 더 의미가 있습니다.

:set hlsearch

1
+1 때문에 hlsearch내가 알지 못했고 어느 날을 검색했을 것입니다 :-). 그러나 기본적으로 * #, n 및 N을 시도했지만 다른 파일 버퍼로 이동하지 않습니다 ...
Stephane Rolland

아니, n하고 N(그들은 주위에 랩) 버퍼를 이동하지 않지만 그들은 모든 탭에서 검색되는 대상 용어; 히트 *당신의 탭을 통해 다음주기에 강조와이 - 당신이 사용할 수 있도록 그들은 모두 같은 용어로 강조 표시됩니다 nN새로운 검색하지 않고 로컬있다.
goldilocks

2
요점은 모든 경기를 찾기 위해 탭을 순환 할 필요가 없습니다.
Magnus

1
@Magnus 바람직하지는 않지만 실제로는 질문에 명시 적으로 언급되어 있지 않습니다. 이 검색은 "모든 버퍼 로 확장 " -> 모든 버퍼로 확장됩니다. 내 대답의 요점은, 특히 당신이 hlsearch설정 하지 않은 경우가 아닐 수 있기 때문에 이것을 분명히하는 것이 었습니다 .
goldilocks


1

내가 자주하는 일을 발견하면서 나는 (개선 할 수없는) 스크립트를 으깨었다.

당신이나 다른 사람이 유용하다고 생각할 수도 있습니다.


간단한 설명 :

기본적으로 버퍼 목록을 검색하여 빠른 수정 창에 결과를 표시합니다.

두 가지 기본 명령이 추가되었습니다.

  1. Search <pattern> : 모든 버퍼를 검색합니다 <pattern>.
  2. Search1 <pattern>:에 대한 모든 버퍼를 검색 <pattern>하지만 각 버퍼에 대한 첫 번째 결과 만 표시합니다. 일반적으로 함수, 변수 foo가 사용되는 모든 버퍼를 나열하는 데 유용합니다 .

뱅 사용 (:Search! foo )을 하여 결과를 추가하십시오.

또한 GSearchGSearch1차이와 그 곳에 추가 Search스크립트 추가 정규식 구분 기호, 예를 :

foo -> /foo/

어디로 GSearch그것이 동봉 될 것으로 예상되는 .

j플래그는 항상 점프를 방지하기 위해 추가됩니다.


암호:

동시에 코드를 짧게 유지하면서 오류 목록을 방지하는 몇 가지 해킹이 있습니다. try / catch에 약간 성가신했다 bufdo.

let s:not_idents = split("/!#$%&\"`´¨'¯()*+,-.:;<=>?¿@[\]^{|}µ¶·¸~±×÷®©«»¬­ª°º¹²³¼½¾", '\zs')
" Create a delimited pattern. "
fun! s:Parse_pat(pat)
    for c in s:not_idents
        if stridx(a:pat, c) == -1
            return c . a:pat . c
        endif
    endfor
    echohl Error
    echom "Could not delimit pattern '". a:pat ."'"
    echohl None
    return ''
endfun

fun! s:AllBufSearch(pat, bang, uno, isg)
    if a:isg
        let pat = a:pat
    else
        let pat = s:Parse_pat(a:pat)
    endif
    if pat == ''
        return
    endif
    cclose
    let [_buf, _view] = [bufnr("%"), winsaveview()]
    let _foldenable = &foldenable
    set nofoldenable

    " Copy of current qflist. "
    let qfc = getqflist()
    " Hack to prevent error if no matches. "
    call setqflist([{}])
    silent execute "bufdo vimgrepadd! " . pat . "j %"
    " Restore "
    exec "buffer " . _buf
    let &foldenable = _foldenable
    call winrestview(_view)
    " Fix "
    let qf = getqflist()
    call remove(qf, 0)
    " Only one listing per buffer. "
    if a:uno
        let bn = {}
        let i  = 0
        for m in qf
            if has_key(bn, m["bufnr"])
                call remove(qf, i)
            else
                let bn[m["bufnr"]] = 1
                call remove(qf[i], "valid")
                let i += 1
            endif
        endfor
    endif
    if a:bang == "!"
        let qf = qfc + qf
    endif
    " If any matches, copen. "
    if len(qf)
        call setqflist(qf)
        copen
    endif
endfun

command! -nargs=1 -bang Search   call s:AllBufSearch(<q-args>, "<bang>", 0, 0)
command! -nargs=1 -bang Search1  call s:AllBufSearch(<q-args>, "<bang>", 1, 0)
command! -nargs=1 -bang GSearch  call s:AllBufSearch(<q-args>, "<bang>", 0, 1)
command! -nargs=1 -bang GSearch1 call s:AllBufSearch(<q-args>, "<bang>", 1, 1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.