Tüm açık arabellekler için arama sonuçları nasıl gösterilir?


17

Sık sık yaptığım bir şey (ama yapmak için komut satırına güvenen) birden fazla dosyada arama / grev.

Tüm açık arabellekler için arama sonuçlarını görüntülemenin bir yolu var mı?

İdeal olarak, sonuç konumunu ve snippet'i olduğu gibi yeni bir bölünmüş arabellek istiyorum grep. Örneğin ( /statistics):

models/statistics.php: /*! \file   statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();

Bir bonus olarak, imlecin altındaki terimi aramak istiyorum gd, tıpkı olduğu gibi .


Yanıtlar:


15

:vimgrep /pattern/ {files}Hızlı düzeltme listesini eşleşen desenlerle doldurmak için kullanabilirsiniz . Sorun, :vimgrepdosya seçeneğinin arabelleklere doğrudan izin vermemesidir. Kullanabilirsiniz:

%   Is replaced with the current file name.       *:_%* *c_%*
#   Is replaced with the alternate file name.     *:_#* *c_#*
#n  (where n is a number) is replaced with        *:_#0* *:_#n*
    the file name of buffer n.  "#0" is the same as "#".     *c_#n*
##  Is replaced with all names in the argument list   *:_##* *c_##*
    concatenated, separated by spaces.  Each space in a name
    is preceded with a backslash.
#<n (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
    file name n.  See |:oldfiles| or |v:oldfiles| to get the
    number.                         *E809*
    {only when compiled with the |+eval| and |+viminfo| features}

Başka bir seçenek, dosya listesi oluşturan bir komut dosyası yazmaktır :buffers. Hafif bir tweek ile bu SO yazı başına :

function! BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction

function! GrepBuffers (expression)
  exec 'vimgrep/'.a:expression.'/ '.join(BuffersList())
endfunction

command! -nargs=+ GrepBufs call GrepBuffers(<q-args>)

Artık :GrepBufs <expression>standart :vimgrepçıktıyı arayabilir ve alabilirsiniz ancak bunun yerine tamponları kullanabilirsiniz.

GüncelleGrepBuffers İmlecin altındaki değeri kullanarak aramak istiyorsanız, bu yeni eşlemeyi ekleyin.

nnoremap <leader>z :call GrepBuffers("<C-R><C-W>")<CR>

Eğer normal mod tipinde olduğunda <leader>zve yeni sekme :vimgrepaçık tampon üzerinde imleç sözcüğü.


2
Tek hat formda: command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' '). Kullanım::Bufgrep/foo/
Peter Rincker

8

Yalnızca açık arabelleklerde arama yapmak güzeldir, ancak tüm projede arama yapmak istediğiniz bir zaman gelebilir. Düşündüğünüzden daha hızlı ve daha kolay olabilir!

Bir projede arama yapma

  • grepUnix standart arama aracıdır. Yaygınlığı nedeniyle kayda değer. Zaten :grepkomutla Vim'e entegre edildi . örn :grep -r 'foo'. Bkz :h :grep.
  • Ack , normal grep'ten daha hızlıdır, çünkü VCS dizinlerini, ikili dosyaları atlar ve gibi belirli dosya türlerini arayabilir --perl. Vim entegrasyonu için bkz. Ack.vim
  • Ag Gümüş Sörfçü , ack'e benzer, ancak daha hızlı bir kod arama aracıdır. Vim eklentisi: Ag.vim
  • git grepveri havuzunu çok çabuk arar. Fugitive.vim sağlar :Ggrep.
  • Ripgrep , Ag ve git grep. İle de kullanılabilir :grep.

Ben hem ripgrep, Ag, hem git grepde hepsi süper hızlı öneririz . 1 saniyeden daha az bir sürede 4700'den fazla arama yaptım. Ripgrep'i yenmek oldukça zor.

Bu alternatiflerden birini eklenti olmadan test etmek veya sadece bir eklenti istemiyorsanız 'grepprg'seçeneğinizi buna göre ayarlayabilirsiniz . örneğin set grepprg=ag\ --vimgrepveya set grepprg=rg\ --vimgrep. Daha fazla bilgi için :h 'grepprg've bölümüne bakın :h 'grepformat'. Şimdi üzerinden arama yapabilirsiniz :grep. örn :grep 'foo'.

Son bir geri dönüş :vimgrepolarak, Vim'in mevcut olduğu tüm sistemlerde mevcut olduğu için kullanabilirsiniz. Daha :h :vimgfazla yardım için bakın .

Hızlı Düzeltme Listesi

Bu seçeneklerin çoğu hızlı düzeltme listesini kullandığından, hızlı düzeltme listesini çaprazlamak için daha kolay eşlemeler kullanmanızı öneririm. Tim Pope ve sırasıyla ve için kullanan eşsiz eklentisini kullanıyorum . Bir arama daha sonra almak için şunları da eklemek gerçekleştirildikten sonra Quickfix gibi bazı insanlar açmak için dosyaya: . QuickFix listesini manuel olarak da açabilirsiniz .]q[q:cnext:cprev~/.vimrcautocmd QuickFixCmdPost *grep* cwindow:copen

Daha da hızlı "aramalar" ister misiniz?

Ctags , cscope veya GNU global gibi önceden oluşturulmuş dizinler kullanan bazı araçlar kullanmanız gerekecektir .

  • Vim aracılığıyla ctag destek inşa etti :tag, <c-]>ve birçok diğer komutlar ve seçenekler. Bkz :h tags. Ayrıca Git ile Zahmetsiz Ctags okumak veya Gutentags eklentisine bakmak isteyebilirsiniz
  • Cscope desteği de yerleşiktir ve :cscopekomutla kullanılabilir . Görmek:h cscope

Daha fazla yardım

Bu güzel Vimcast bölümü ile başlıyorum: ile birden fazla dosya arayın:vimgrep .

Daha fazla Vim yardımı için belgelere bakın:

:h grep
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
:h quickfix
:h :cnext
:h tags
:h cscope

6

Benim eklenti GrepCommands tanımlayıp ait varyantları yerleşik :vimgreptüm argümanları, listelenen tamponlarını, pencereler geçerli sekme sayfasında veya arama için tüm sekme sayfalarını hedef komuta. Temel olarak, @ jecxjo'nun cevabının sağlam bir eklenti uygulaması.


1

Komutlar :bufdove:vimgrepadd

Bu cevap /programming//a/11976158/1057593 adresine dayanmaktadır .

Ancak, birkaç bit eklemek istedim. Yine temel komut

:bufdo vimgrepadd pattern %

Hızlı düzeltme listeniz boş değilse, büyük olasılıkla önce listeyi silmek istersiniz (bkz. Https://stackoverflow.com/q/27385970/1057593 ). Bu ile yapılabilir

:cexpr []

vim-unimpaired eşlemeler ]qve eşleşmeler arasında geçiş yapmanızı sağlar [q.

komut_satırı-tarih

İle arama desenini ayrı ayrı girmek iyi bir iş akışıdır /pattern. Bu, geçerli arama modelini kullanarak komut satırı geçmişinizden genel bir komut kullanmanızı sağlar. Bu benziyor

/pattern
:bufdo vimgrepadd // %

Tipik yeni bir tampon genişliğinde arama

/pattern2
:bufdo<up><up>...

Kullanmak için vimrc'ye <C-N>ve <C-P>ok tuşları yerine aşağıdaki eşlemeleri ekledim

cmap <C-P> <Up>
cmap <C-N> <Down>

Komut geçmişini aramak için tuşunu kullanın q:ve ardından /bufdo<CR>ile bir komut çağırın <CR>. Daha fazla ayrıntı için bkz. Https://vim.fandom.com/wiki/Using_command-line_history ve yardım sayfaları :h historyve :h cmdline-window.

:copenHızlı düzeltme listesini hemen şu şekilde görmek için yeniden kullanılabilir komutuna ekleyebilirsiniz :

:execute "bufdo vimgrepadd // %" | copen

Stackoverflow'un önerisi :bufdo vimgrepadd // % | copenbenim durumumda birkaç istenmeyen pencere açtı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.