Yalnızca eşleşen satırları göster?


31

Uzun bir dosyada, yaklaşık 200 satır kadar eşleşecek bir kalıp aramak istiyorum. Eşleşen çizgiler dosyada rastgele yerlerdedir.
Bir çizgi eşleştiğinde, sadece çizginin kendisi ilgilidir, yukarıda veya altında bir bağlam yoktur.

Normalde, ile arar /ve kibritlerle atlardım n.
Ancak bu, ekranda aynı anda yalnızca bir veya iki ilgili satır olduğu anlamına gelir.

Sonuç satırları listesinden geçerken eşleşmeyen tüm satırları gizlemenin bir yolu var mı?


Bir kaba kuvvet yaklaşımı, eşleşen olmayan tüm satırları silmek ve daha sonra bu silme işlemini geri almak olacaktır. Ama bu, çeşitli şekillerde çirkindir, kalıcı olarak bitmeyecek olsa bile ...

Yanıtlar:


34
:vimgrep pattern %
:cwin

vimgrepmodelinizi geçerli dosyada ( %) veya belirttiğiniz dosyaları arayacaktır .

cwinDaha sonra pencerenizde sadece istenen satırları gösterecek bir tampon açacaktır. cwinTampon içinde hemen hemen herhangi bir gezinme / arama komutunu kullanabilirsiniz . Kaynak dosyadaki imlecin altındaki satıra atlamak için return tuşuna basın.


1
:vimgrepkısaltılabilir:vim
D. Ben Knoble

tekrar arabellek geri nasıl alırım?
paşa

Ayrıca arabellek nasıl kapatırım? şimdiden teşekkürler
paşa

Quickfix (cwindow) tamponundan, orijinal tampondaki o konuma atlamak için herhangi bir satıra geri dönebilirsiniz. Herhangi bir yerden cwindow tamponunu kapatabilirsiniz :ccl[ose]ya da normalde bir tamponu kapatabilirsiniz (örneğin, ona geçin ve :bd). Hızlı düzeltme arabelleğini yeniden çalıştırarak :cw[indow]yeniden açabilirsiniz ve son vimgrep sonuçlarınızı kullanır.
Zach Ingbretsen

15

İle eşleşen tüm satırları listeleyebilirsiniz.

:g/{pattern}

( :printKomut atlanabilir; bunun için varsayılandır :g.)


1
Bu "orjinal grep" ( g/REgexp/p) ... Sorun şu ki, maçlardan birine kolayca atlayamamanız ...
Martin Tournoij

@Carpetsmoker: Haklısın; Bunun için bir eklentim var, diğer cevabımı görün.
Ingo Karkat

Bu birçok durumda faydalı olabilir. Çıktı yeni bir belleğe yönlendirilebilir mi? Bu hala satırları vurgulayan sözdizimi olmasına izin verir. (Hmm ... bu başka bir soruyu gündeme getirir, bir saniye bekleyin ...)
Volker Siegel

@IngoKarkat ne anlama geliyor g. Bunun küresel bir model olduğunu varsayıyorum. Genelde VI ile eğik çizgi ararım /patternve bu tüm olayları bulur. Biri mektuba basarak onlara gidebilirn
Alexander Cska

@AlexanderCska: Hayır, arama için bir değiştirici değil :g[lobal], bir argüman olarak desen alan ayrı bir komuttur . Tüm detayları adresinde bulabilirsiniz :help :global.
Ingo Karkat

12

Alakasız çizgileri katlamak için foldmethodve foldexprseçeneklerini kullanabilirsiniz .

Aradıktan sonra, son arama @/kayıt defterine kaydedilir. Böylece, bu şekilde eşleşmeyen her şeyi kolayca kaldırabilirsiniz (yalnızca bir satırlık eşleşmeler için):

:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr

Gösterebileceğiniz veya gizleyebileceğiniz bağlam satırlarına birden fazla katlama düzeyi eklemek veya birden fazla satır eşleştirmek gibi daha gelişmiş yöntemler Vim Tips Wiki'de bulunabilir .


Bir set foldlevel=0ihtiyaç var gibi görünüyor ? Ama belki bu varsayılandır.
Volker Siegel,

1
Evet, varsayılan sıfırdır, ancak onsuz çalışmazsa, ekleme zarar veremez. :-)
Ben

Ama şimdi ... iz bırakmadan nasıl geri döneceğim?
Volker Siegel,

normal modda, katlamayı açmak ve kapatmak için 'zi' kullanabilirsiniz.
John O'M.

Bunu yaptığımda çoğu zaman ilk önce :tab spdosyaya yeni bir bakış atışı ekleyebilirim. O zaman geri dönmek, :closesekmeyi öldürmek için olduğu kadar basit bir yöntemdir.
Ben,

6

Eğer sipariş önemli değilse, sadece çizgileri hareket ettirin.

:g/pat/m0

Daha fazla yardım için bkz:

:h :g
:h :m

1
Ve :g/pat/m$(eşleşen çizgileri sonuna kadar
Lerner Zhang

6

[d] tüm çizgileri değil (!) eşleştirme kalıplarını seçer:

:g!/pattern/d

veya daha da basit ('B Katmanı' yorumunuz için teşekkürler):

:v/pattern/d

Evet, ama eşdeğer kullanmak daha geleneksel var :vziyade :g!. (Son kullanılanları ne zaman gördüğümü hatırlamıyorum, TBH!)
B Layer


0

Başka bir yol kullanmaktır :h :ilist, ben man sayfasına bir genel bakış elde etmek için kullanıyorum. Bunun sonucu şöyle görünüyor:

~/find.~
  1:    3 NAME
  2:    6 SYNOPSIS
  3:    9 DESCRIPTION
  4:   18 OPTIONS
  5:   93 EXPRESSION
  6:  779 EXAMPLES
  7:  877 HISTORY
  8:  931 BUGS

İşte endekse göre sonuç satırına gitmeyi seçmenizi sağlayan küçük bir fonksiyon:

function! s:select_ilist(ilist_result)
  if empty(a:ilist_result) || a:ilist_result =~# '^\_s*Error'
    return
  endif

  let select = input(a:ilist_result . "\ngoto : ")
  if empty(select) | return | endif

  " ilist result starts with '\nfilename\n', filename can be empty
  let lines = split(a:ilist_result[stridx(a:ilist_result, "\n", 1) : ], "\n")
  if select <= 0 || select > len(lines) | return | endif

  exec matchstr(lines[select-1], '^\v\s*\d+\:\s+\zs\d+')
endfunction

Bu şekilde kullanılabilir:

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
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.