Vim'in arama maçlarını nasıl listeleyebilirsiniz?


101

Şuna bastığımda maçları listelemek istiyorum:

/example

böylece tüm eşleşmelerin aynı anda nerede olduğunu görebilirim.

Yanıtlar:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
F5-F8 fikirlerinizi çok beğendim. Bu komutların bazı görselleştirmelerine / çıktılarına burada sahip olmak güzel olurdu. F8 nasıl çalışacak şekilde tasarlanmıştır? Sadece mevcut dizini mi arar? - - Bir dizinin ihmal edilmesi bir gelenektir - - neden node_modules? - - Perl normal ifadeleri Vim'in varsayılan işlevini nasıl değiştirir? - - Aşağıdakiler .tex dosyalarına yönelik aramamı nasıl tasarladığımdır askubuntu.com/a/789769/25388 Bunu nasıl geliştireceğinizi sizden öğrenmek güzel olurdu. O kadar sezgisel değil, bu yüzden ben de sık sık mantığı unuttum.
Léo Léopold Hertz 준영

node_modules, ön uç geliştirecekseniz npm modüllerinden çok sayıda js kodu içeren dizindir ... bu sadece bir örnek ...
Yordan Georgiev

1
.vimrc dosyanızın bir yedeğini alın ve bu ayarları ekleyin, bunları yükleyin: yani% ve komutlardaki "yardımları" çalıştırmayı deneyin ... vim zordur - bunları binlerce kez tekrarlamanız gerekir, ancak bir kez onlara hakim olun @ yepyeni UI IDE özelliklerini işaret eden herkese gülersiniz ...
Yordan Georgiev

226
:g//p

Daha uzun biçiminde:

:global/regular-expression/print

Kalıp / regex'i dışarıda bırakabilirsiniz ve Vim önceki arama terimini yeniden kullanacaktır.

Diğer bilgiler: grep aracı bu komut dizisi almıştır.


18
:g//- p (rint) varsayılan eylem olduğundan, bunu da atlayabilirsiniz.
dekeguard

6
:g/daha da kısa!
Sparhawk

2
Grep'teki gibi burada bağlam görmek mümkün mü --context 9?
Vitaly Zdanevich

@VitalyZdanevich Try :%s/regular-expression//gn It şu satırlarda bir şeyler üretecek:X matches on Y lines
Alexej Magura

@AlexejMagura Demek istediğim - dizeden önce ve sonra birkaç satırı nasıl görebilirim?
Vitaly Zdanevich

50

Ayrıca şunları da yapabilirsiniz:

g/pattern/#

bu, istediğiniz deseni ve satır numarasını yazdıracaktır.


2
Güzel bir. Ancak satır numaralarını zaten etkinleştirdiyseniz, #gerekli değildir. Varsayılan olarak satır numaralarını gösterir
Pavan Manjunath

44

Bu listeye bakmak ve eşleşmeler arasında hızlıca atlamak istiyorsanız, kullanmayı düşünün

:vimgrep example %

veya

:grep example %

Bu, "hata listesini" tüm eşleşmelerle doldurur, böylece :copenhepsini hızlı düzeltme arabelleğinde listeleyebilir, o eşleşmeye atlamak için belirli bir satırda enter tuşuna basabilir veya ileri geri gitmek için :cnve gibi komutları kullanabilirsiniz :cp.

ayrıntılı bir açıklama için benzer bir soruya verdiğim cevaba bakın


Bu E499: Empty file name for '%' or '#', only works with ":p:h", MacVim 8.1'de verir
Lincoln Bergeson

35

: Sadece bir yenisini öğrendik Location List!
Tip :lvim foo %aramak için foogeçerli dosyasında bulunan ve gerekli tüm maçları girmek fooiçine konum listesinin .
Tip :lopenzamanki gibi tam gezilebilir QuickFix penceresinde, konum listesini açın.
Kullanım :lnext/ :lpreviousetmek üzere listede (kullanım tpope / zarar görmemiş en iyi deneyim için eşleştirmeleri)


2
Güzel ipucu! bu beni, imlecin altındaki kelimeyi otomatik olarak genişleten ve tek bir taramada açan bu eşlemeyi yapmaya yöneltti: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen

16

Diğer bir olasılık, dosya içerme arama komutlarını kullanmaktır.

[I

Bu, imlecin altındaki kelimenin tüm geçtiği yerleri listeleyecektir. Yine de ihtiyacınız olandan daha fazlası olabilir, çünkü geçerli dosyada bulunan dosyaları da arayacaktır.

Ancak bu komutla ilgili güzel olan şey, arama sonucu ekranının her bir eşleşmenin satır numarasına ek olarak eşleşme sayısının da göstermesidir.

:help include-search

birçok varyantı görmek için.

Hakkında bir not

:g//p

Bu daha da azaltılabilir

:g//

çünkü, diğerlerinin de söylediği gibi, p (rint) varsayılan eylemdir.


[IGrep'teki gibi bağlamdan sonuç almak mümkün mü --context 9?
Vitaly Zdanevich

10

quickfixMevcut arama modelinizden eşleşmelerle güzel bir pencere elde edebilirsiniz

:vim // %
:copen

daha önce karmaşık bir arama modeli oluşturduysanız çok kullanışlıdır. /pattern

Düzenleme : bunun tüm açık arabellekler için de işe yaradığını öğrendim

:bufdo vimgrepadd // %
:copen

10

Kullanımı :set hlsearchtüm eşleşmeleri sarı renkte vurgular ve böylece eşleşmeler için dosyayı kolayca taramanıza olanak tanır. Yine de istediğiniz şey bu olmayabilir, aradıktan sonra: g // p size listelenen eşleşmeleri verecektir


2
': Set hlsearch' not ': hlsearch' olmalıdır.
çok fazla php

:nohlArtık ihtiyacınız kalmadığında vurguları temizlemek için haritalamak da yararlıdır .
Kos

9

Bunu detaylandırmak yerine ...

/example
:g//p

doğrudan da yazabilirsin

:g/example/p

veya, p (rint): g (lobal) komutu için varsayılan eylem olduğundan, bu kısaltılabilir.

:g/example

Ve p (rint) yerine başka eylemler de mümkündür, örneğin d (elete). Bakın: yardım: global


6
g/pattern

Varsa :set number, yukarıdaki komut satır numaralarını da görüntüler.

Eğer yapmadıysan :set numbero zaman

g/pattern/#

satır numaralarını gösterecektir.


0

Bunun için bir kod parçası yazdım. Aslında içindeki sorunları önler vimgrep. Adsız dosyalarla bile çalışır. Ve kullanımı daha kolay.

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

Bir kalıpla çağırdığınızda, tüm eşleşmeleri içeren konum pencerelerini açar.

Bu bir komut olabilir

command! -nargs=1 Mat call Matches(<f-args>)

Yani tek yapmanız gereken yazmak :Mat pattern

Mevcut görsel seçimin eşleşmelerini elde etmek için aşağıdaki eşleştirmeyi de kullanıyorum.

vnoremap Y "xy:call Matches(@x)<CR>

-1

Tüm arama sonuçlarını listelemek için Ctrl-f:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
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.