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

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

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

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

  1. 열려 있는 탭이 모두 열려 있나요?
  2. 모든 오픈 버퍼?

답변1

이는 실제로 기본 동작이지만 알아차리기 어려울 수 있습니다. *그런 다음 다른 탭으로 변경하고 명령 모드에서 nans를 사용하여 N검색 항목 사이에서 앞뒤로 이동해 보세요.

먼저 모든 히트에 대해 강조 표시를 켜면 더 의미가 있을 수 있습니다.

:set hlsearch

답변2

나는 귀하의 문제에 대한 정확한 해결책을 갖고 있지 않으며 내 것보다 더 나은 답변을 찾고 싶습니다. 하지만 이것이 모든 버퍼에서 단어를 찾는 문제를 해결한 방법입니다.

" 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>

답변3

 :bufdo vimgrepadd yoursearchterm % | copen

답변4

나는 이 일을 많이 하고 있기 때문에 (개선 가능한) 스크립트를 혼합했습니다.

귀하 또는 다른 사람들이 유용하다고 생각할 수 있습니다.


간단한 설명:

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

기본 명령어 2개가 추가되었습니다.

  1. Search <pattern>: 모든 버퍼를 검색합니다 <pattern>.
  2. Search1 <pattern>: 모든 버퍼에서 검색 <pattern>하지만 각 버퍼의 첫 번째 결과만 표시합니다. 일반적으로 foo함수, 변수(또는 기타 항목)를 사용하는 모든 버퍼를 나열하는 데 유용합니다 .

:Search! foo결과에 추가하려면 앞머리( )를 사용하세요 .

GSearch또한 및 추가 GSearch1, 차이점은 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)

관련 정보