커서를 사용하여 현재 단어 위에 *와 #를 사용하여 Vim 단어 검색을 배우기 시작했습니다 . 그러나이 검색은 현재 파일 버퍼로 제한됩니다.
이 검색을 확장 할 수있는 명령 또는 바로 가기가 있습니까?
- 모든 열린 탭?
- 모든 열린 버퍼?
커서를 사용하여 현재 단어 위에 *와 #를 사용하여 Vim 단어 검색을 배우기 시작했습니다 . 그러나이 검색은 현재 파일 버퍼로 제한됩니다.
이 검색을 확장 할 수있는 명령 또는 바로 가기가 있습니까?
답변:
귀하의 문제에 대한 정확한 해결책이 없습니다. 그러나 이것이 모든 버퍼에서 단어를 찾는 문제를 해결하는 방법입니다.
" 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>
…
:cn하거나 :cp전환 할 수도 있습니다.
실제로 알아볼 수는 없지만 기본 동작입니다. *다른 탭으로 변경하고 명령 모드에서 nans N를 사용 하여 검색 적중 사이를 앞뒤로 이동하십시오.
먼저 모든 적중에 대해 강조 표시를 켜면 더 의미가 있습니다.
:set hlsearch
hlsearch내가 알지 못했고 어느 날을 검색했을 것입니다 :-). 그러나 기본적으로 * #, n 및 N을 시도했지만 다른 파일 버퍼로 이동하지 않습니다 ...
n하고 N(그들은 주위에 랩) 버퍼를 이동하지 않지만 그들은 모든 탭에서 검색되는 대상 용어; 히트 *당신의 탭을 통해 다음주기에 강조와이 - 당신이 사용할 수 있도록 그들은 모두 같은 용어로 강조 표시됩니다 n및 N새로운 검색하지 않고 로컬있다.
hlsearch설정 하지 않은 경우가 아닐 수 있기 때문에 이것을 분명히하는 것이 었습니다 .
내가 자주하는 일을 발견하면서 나는 (개선 할 수없는) 스크립트를 으깨었다.
당신이나 다른 사람이 유용하다고 생각할 수도 있습니다.
기본적으로 버퍼 목록을 검색하여 빠른 수정 창에 결과를 표시합니다.
두 가지 기본 명령이 추가되었습니다.
Search <pattern> : 모든 버퍼를 검색합니다 <pattern>.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)