Vim'deki bir komutun sonucu tarafından verilen bir dosyayı açın.


34

Neredeyse her gün aşağıdakileri yaparken kendimi buluyorum

  1. Bir bul çalıştır ( find -name somefile.txt)
  2. Sonucu aç vim

Sorun sonucunu kopyalayıp yapıştırmak zorunda olduğu findiçine vimkomuta. Bunu yapmaktan kaçınmanın bir yolu var mı? Biraz denedim ( find -name somefile.txt | vim) ancak çalışan hiçbir şey bulamadım.

Şimdiden teşekkürler

Yanıtlar:


31

Komut ikame kullanabilirsiniz:

vim $(find -name somefile.txt)

veya

find -name somefile.txt -exec vim {} \;

1
tamam. Eğer gerekli olan buysa, -name somefile.txt | xargs vim
balki

3
Hayır, bu düzgün çalışmıyor ve terminalinizi bozabilir! Xargs vim kanalına bağlayamazsınız çünkü giriş bir etkileşimli terminalden gelmesini bekler.
dogbane


4
Başka bir alternatif olacaktır vim `find -name somefile.txt`. @StuartPowers Alternatif olarak, vim `!-1`eğer bu bulguyu daha önce kullandıysanız kullanabilirsiniz önceki komut
Bernhard

1
@balki bu senaryoda xargs kullanmak için, bayrak kullanmalısınız -o, bu adam: -o Komutu çalıştırmadan önce alt süreçte / dev / tty komutunu yeniden açın. Bu, xargs'ın etkileşimli bir uygulama çalıştırmasını istiyorsanız kullanışlıdır.
davidmh

7

Bunu dene:

  1. vim başlatmak
  2. vim'de aşağıdakileri kullanın:

:r!find /<path> -name 'expression'

Arama tamamlandığında sonuçlar vim'de görünmelidir.

Veya

Deneyin:

find /<path> -name > results.txt
vim results.txt 

Benim çözümüm aynısını yapar ama neden oy kullandı?
balki

5

Komutu tekrar çalıştırmaktan sakıncası yoksa: düğmesine basın Upve bir xargskomut ekleyin . Veya geçmiş ikame kullanın ve çalıştırın

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

Ksh ve zsh ile çalışan, ancak bash'de olmayan bir komutun çıktısını kaydetmenin hafif bir yolu var (bu, bir kabuk hattının çıkış tarafının ana kabukta çalıştırılmasını gerektirir). Boru işlev komutu K(aşağıda zsh tanımlı), k değişkeni çıktısı eeps $K.

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

Her komutun çıktısının otomatik olarak kaydedilmesi tek başına kabuk ile mümkün değildir, komutu öykünmüş bir terminalde çalıştırmanız gerekir. Oturumunuzu çalıştırarak script(BSD yardımcı programı, ancak Linux ve Solaris dahil çoğu sistemde kullanılabilir), oturumunuzun tüm çıktısını bir dosyadan kaydeder (typecript içindeki son bilgi istemini güvenilir bir şekilde saptamak için hala biraz çaba gerekir) ).


2

Ben arka keneleri kullanmayı seviyorum `(Onun ~ ile aynı tuşun üzerinde)

> vim `find . -name somefile.txt`

Geri keneler, kenelerin içindeki komutu çalıştırır ve çıktı daha sonra komut tarafından kullanılabilir. Yukarıdakiler, tüm dosyaları somefile.txt olarak bulacaktır, böylece tüm dosyalar arasında dolaşmanıza izin verir :next.

Komutu ayrıntılandırmak için birkaç deneme yaparsanız çok kullanışlıdır, çünkü daha sonra editörün komutunu tekrarlamak için geçmiş değiştirme özelliğini kullanabilirsiniz.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`

2

Buradaki noktayı kaçırmış olmalıyım, çünkü kullanırdım:

:find **/somefile.txt

(içimde sadece bir tane olduğunu bilseydim :echo &path ) ya da hepsini isterdim:

:args **/somefile.txt

Düzenleme: Whoa! Tamam, bu yüzden yaptım özledim noktası - sen bulmak listesi, gerçek dosyalar açılmaz istiyor? Deneyin (yine, Vim'den):

!!find . -name somefile.txt

-- benim hatam :)


1

@Davidmh yorumlarda işaret ettiği gibi, eğer etkileşimli bir uygulama kullanmak istiyorsanız xargsbayrakla -okullanabilirsiniz.

find . -name somefile.txt | xargs -o vim

Eğer kullanmıyorsanız -o, sen vim ayrıldıktan sonra muhtemelen pisliği terminal durumu olacak. Bunu yaptıysanız, terminalinizi aşağıdaki komutla sıfırlayabilmeniz gerekir:

reset

0

İstediğini yapan bir fonksiyon yazdım pvim. Birden fazla satır pvimona bağlanırsa, tümü hariç ilke yoksayılır, birden fazla dosyayı vim'de açmasına rağmen uzatılabilir.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

Gibi kullanın:

stu@sente ~ $ find . -name "foo.txt" | pvim

ki bu ilk "foo.txt" yi tıpkı sizin yazdığınız gibi vim'e yükler:

vim $(find . -name "foo.txt | head -n1")


0

İşte daha xargsönce bahsedilenlerden daha basit bir çözüm:

find -name somefile.txt | xargs vim -p

-pSeçenek söyler vimayrı bir sekmede her dosyayı açmak için. Bunu tampon kullanmaktan daha uygun buluyorum.


0

Bir dosyayı locatevim yardımı ile açmanın son derece uygun ve çok daha hızlı olduğunu buldum find.

Aşağıdaki komut app.py, dizini içeren yolda adı verilen bir dosyayı arar MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
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.