Yardımdan :help backtick-expansion
:
On Unix and a few other systems you can also use backticks for the file name
argument, for example:
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.
Yardımdan alınan komutu yazarsam bir hata alırım:
:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards
Yardımdaki örnek neden bir yerine iki ters eğik çizgi kullanıyor ve neden çalışmıyor?
Aşağıdaki çalışma:
Yıldızı
find
programdan önce kabuk tarafından genişletilmekten koruyan iki ters eğik çizgiden birini kaldırırsam ::next `find . -name ver\*.c -print`
Her iki ters eğik çizgiyi kaldırır ve desenin etrafına tek tırnak koyarsam
ver*.c
::next `find . -name 'ver*.c' -print`
Bu noktaya kadar, kural şu şekildedir:
kabuk komutunuz bir yıldız içeriyorsa ve kabuğun komuttan önce genişlemesini istemiyorsanız, önüne bir ters eğik çizgi koyun veya desenin etrafına tek tırnak koyun .
Ancak yardım başka bir örnek veriyor:
:view `ls -t *.patch \| head -n1`
Bu komut herhangi bir değişiklik yapılmadan çalışır, tek tırnak işareti gerekmez, ters eğik çizgi gerekmez.
Çalışmasının nedeni, ls
komutun (komutun -name
argümanının aksine find
) birden çok dosya bağımsız değişkenini kabul etmesinin ve kabuk genişlemesinde sorun görmemesinin nedeni olduğunu varsayalım *.patch
.
Şimdi, hadi ben uzantılı tüm dosyalar için bakmak istiyorum demek .conf
içeride /etc
bir klasöre ve boru çıkışı find
için grep
dizeyi içeren tek eşleşmeleri almak için input
.
Kabukta, herhangi bir çalışma dizininden şunu yazardım:
find /etc -name '*.conf' | grep input
Ve işe yarayacaktı.
Vim'de, aynı komutu etrafına ters tırnaklar koyarak ve vim'in komut sonlandırması olarak yorumlamasını önlemek için boru sembolünün önüne bir ters eğik çizgi yazacağım:
:next `find /etc -name '*.conf' \| grep input`
Ve çalışıyor.
Şimdi, aynı komutu dikey olmadan yazarsam ve grep input
bir hata alırım:
:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards
Yıldızı tek tırnak işareti ile korumama rağmen bu durumda neden bir hata var?
Ve şimdi neden bir hata var, ama daha önce boru ve ile değil grep input
?
Anlamaya çalışmak için daha basit bir komut buldum:
find . -name '*.conf'
.conf
Çalışma dizininde uzantıya sahip tüm dosyaları arar . Komut kabukta çalışır.
Vim'de test etmek için şunu yazdım: :next `find . -name '*.conf'`
Ve işe yarıyor. Bu durumda nokta , vim oturumunu başlattığımdan beri :pwd
ana /home/username
dizinim olan Ex komutu tarafından görüntülenen geçerli çalışma dizinimi temsil eder.
Geçerli çalışma dizininde arama yapmak istediğimde neden çalışıyor, ancak gibi rasgele bir klasörde arama yapmak istediğimde çalışmıyor /etc
?
Şimdi, benim çalışma dizinini değiştirirsem /home/username
için /etc
vim Ex komutuyla :cd /etc
ve yine daha önce olduğu gibi hatalar aynı komutu dışarı yeniden deneyin:
:next `find . -name '*.conf'`
E79: Cannot expand wildcards
Aynı komut ana klasörümdeyken neden çalışıyor ama içerideyken çalışmıyor /etc
?
Eminim biraz mantık vardır, ama bir tane bulamıyorum.
Arglist'i rastgele bir kabuk komutuyla (bir yıldız, bir boru, herhangi bir çalışma dizinindeki herhangi bir dizinde arama) içeren genel ve doğru sözdizimi nedir?
Vim 7.4.942 sürümünü kullanıyorum ve zsh benim varsayılan kabuğum . Bu komutları vim -u NORC -N
bash'tan ve zsh'den en az başlatma ( ) ile test ettim .
Vim'yi bassh'ı çağırmak için zsh yerine yapılandırmam gerekir mi?
vim $(find . -name ver\*.c -print)
, vim $(ls -t *.patch | head -n1)
, vim $(find /etc -name '*.conf' | grep input)
, vim $(find /etc -name '*.conf')
,vim $(find . -name '*.conf')
--remote
, bir grup dosyayı arayabilir ve bir Vim sunucusuna gönderebilirim (argümanla , bkz: vi.stackexchange.com/a/5618/4939 ) ama nasıl yapılacağını merak ediyorum doğrudan geçerli oturumdan yapın. Mümkün değilse bu iyi, ama yardımı okuduktan sonra yapılabilir gibi görünüyor. Eğer öyleyse, vim'in neden benzer komutlara bu kadar farklı tepki verdiğini anlamak istiyorum.
find /etc -name '*.conf'
o komuttan bazı komik isimler geldiğini düşünürdüm, ve bu yüzden tıkandığında çalışmasının nedeni olabilir grep
.
vim $(find . -name ver*.c)