“Vi” yazdığımda “cd” demek istediğimde otomatik olarak algıla?


21

Günde yaklaşık 5 kez, "cd" yazarken "vi" yazarım ve vi dizini açıyorum. Bu beni fındık yapıyor. "Vi + dizini" ne zaman yazıp otomatik olarak "cd + dizini" olarak değiştirdiğimde bunu algılamanın bir yolu olmalı gibi görünüyor. Düşünceler?


1
Ben de araya girerek bulabileceğiniz bir alternatif verdim ^^ (biri sorunun kaynağını düzeltirken o zamana kadar sinirlenmez) ^^
Olivier Dulac


1
Ayrıca klasördeki dosyaya gitmek için Enter ve okları kullanabileceğinizi keşfedene kadar beni çok sinirlendirdi. Üzerindeyken Enter tuşuna bastığınızda açılır.
nuoritoveri

1
Sadece az miktarda titizlikle: zsh olarak değiştirin. Bir dizin adı yazdığınızda o dizine dönüşecek şekilde ayarlayın. Sonek takma adlarını kullanın, böylece * .sh, * .c, * .config yazarken ilgili dosyayı vi'de açar. Buradaki ihmal elbette alışılmadık bir kabukta "vi" veya "cd" yi atladığını görebilirsiniz.
mkingston

3
Bu nasıl olur?
JFA

Yanıtlar:


38

viDizini ile son argüman olarak çağırdığınız varsayımıyla :

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@Alex Sanırım bu yanlış "cd" yerine "vi" yazdığınız ender durumlarda mükemmeldir, aynı zamanda şimdi her zaman "vi" yazmayı da öğretir;) [yani, umarım sık sık yazmazsınız Stresden kurtulmak için bu işlevin olmayacağı başka bir sunucu / makine kullanmak zorundasınız ...] [+1, bu cevap için +1, "$ { 1} "[ve sonra cd" $ {1} "] yerine" $ {! #} "...]
Olivier Dulac

5
@OlivierDulac Agreed - Benzer tehlikeli aliasing olduğu rmiçin rm -ibirçok dağılımları varsayılan olan. Genel olarak sorunları çözmenin en iyi yolunun, etraflarında çalışmak yerine kullanıcıyı çözmek olduğunu düşünüyorum.
Chris Down,

3
@OlivierDulac örtüşme rmiçin rm -i... gelecekte çok daha bela seni içeri (edecektir muhtemelen ve) size geçmişte ama kudretiyle bazı sorunlar kurtarmış olabilir
jlliagre

1
@Alex Peki, visoruyu söyledin ...
Chris Down

2
@crisron: ${!#}dolaylı olarak son argümana atıfta bulunur ve commandyalnızca bu durumda fonksiyon özyinelemesini önlemek için gereklidir.
Chris Down,

4

@ChrisDown cevabından ayrı olarak, işte bir başka yaklaşım: dizinleri atlamak

Bu yaklaşımla şunları yapabilirsiniz:

vi ./*

ve alt dizinleri içerse bile, bu alt dizinleri atlayarak mevcut dizindeki tüm dosyalarda vi başlayacaktır.

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

Bu, sadece vi'yi, dizin olmayan herhangi bir argümanla yapar ... Bu nedenle, "cd" için "vi" kullanmayı öğretmeyecektir;)

Ve az önce yaptıysanız vi'yi aramaz: vi bazı dizini (yani cd yerine yanlış yazılmış vi). Ama o zaman otomatik olarak orada cd olmaz, bu yüzden hala cd ^^ yazmanız gerektiğini hatırlıyorsunuz

Argüman listelerini değiştirmek için "uyumlu" bir yöntem kullandım, böylece birçok platforma taşınabilir.


1
not:: command something"bir şey" komutunu başlatır (yani, "PATH" kullanılarak "$ PATH kullanılarak bulunan" bir şeyin "ilk oluşumu)," bir şey "olarak adlandırılan herhangi bir diğer ad yerine, yerine \somethingsadece takma adı atlar, ancak eğer mevcut olsaydı hala işlevini kullanırdı (ve burada, bu "vi" işlevi kendini ve döngü anlamına gelir) anlamına gelirdi.
Olivier Dulac

@ChrisDown: Bir kullanıcı için bir yardımdan bahsediyoruz, umarım ki kendini hacklemeye çalışmaz. Ve bu değerlendirme, yeni bir argüman seti (set - ...) oluşturmaktır, bu yüzden kendi başına daha az tehlikelidir
Olivier Dulac

@StephaneChazelas: düzenleme için teşekkürler! Bu şekilde yazmaya çalıştım, ama sonsuz döngüden endişe ediyordum [Sana güveniyorum, yine de döngü olmaz !. 'Arg' için iç tedavi başlamadan önce değerlendirilmekte ve bu nedenle "$ @" listesi 'kaydedilmektedir' ve yinelenmektedir ve iç tedavi "$ @" değişse bile değişmemiştir?]
Olivier Dulac

1

Çözümlerden biri cdtamamen kullanmayı bırakmak . shopt -s autocdKendinizinkini .bashrcveya kimliğinizi setopt autocdgirin .zshrc. Sonra farklı bir dizine geçmek için herhangi bir komut kullanmadan dizin adını yazın.

viBir dosyayı düzenlemek istiyorsanız yazmayı unutmayın .

Gerçekten bir dizine geçmek veya bir dosyayı düzenlemek için tek bir komut istiyorsanız, onu bir işlev haline getirebilirsiniz:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}

-6

Unix'te takma ad özelliğini kullanın. Bir kere vi yi cd'ye taktığınızda sorun çözülecektir.


5
... bu, kişinin violdukça istenmeyen görünen takma adı el ile geçersiz kılmadan kullanamayacağı anlamına gelir .
Chris Down,

3
Bu cevap biraz trollish olarak karşımıza çıkıyor. Bu does OP onlar hiç bir dosya üzerinde vi gerekli belirtmedi olarak, orijinal soruya cevap. Cevap, biraz eğlenceli olsa da, kesinlikle faydalı değil.
gerrit

1
@ChrisDown Veya vimbunun yerine doğru kullanmayı kullanmayı öğretir .
Kevin

@Kevin vim, vi'den daha "uygun" değildir - birçok sistemde, vi uygun olanıdır.
Chris Down,

1
@ChrisDown Ne olacağını bilmek daha iyi olacağını savunuyorum. Vim özelliklerini kullanmayı düşünüyorsanız, kullanın vim. Mevcut değilse vi, daha sınırlı özellik kümesini kullanın ve bekleyin.
Kevin
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.