
カーソルが現在の単語にあるときとを使ってVimの単語検索を学び始めました*
。#
ただし、この検索は現在のファイルバッファに制限されています。
この検索を次に拡張できるコマンドやショートカットはありますか?
- 開いているタブはすべて開いていますか?
- すべてのオープンバッファ?
答え1
これは実際にはデフォルトの動作ですが、気付くのは難しいかもしれません。*
次に、別のタブに変更し、コマンドモードでn
ansを使用して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
検索パターンを引数として使用し、結果をクイックフィックスリストに記録するコマンドを作成します。他の2行は(少なくとも私にとっては)役に立たない矢印キーを便利な項目にマップし、次/前の検索または次/前のコンパイルエラーなどに移動するようにマップされ、リストを段階的に実行するための簡単な修正です。 。次のように使用できます。
:Search foobar
<right>
<right>
…
答え3
:bufdo vimgrepadd yoursearchterm % | copen
答え4
私はこのことをたくさんしているので(改善可能な)スクリプトを混ぜました。
あなたや他の人が役に立つと思うかもしれません。
簡単な説明:
デフォルトでは、バッファリストを検索してクイック修正ウィンドウに結果を表示します。
基本命令2つが追加されました。
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)