CD argümanları duyarsız hale nasıl getirilir?


9

Bazen çeşitli dizinlere erişirken çoğu zaman Linux sistemimiz altındaki bir dizinin adlarını veya en azından bir bölümünün adlarını hatırlıyorum. Ancak bazı dizinler ilk harf büyüklüğünden başlayarak veya Büyük harf adının ortasındaki karakterlerden biriyle adlandırılır.

Herkes cdkomut case INSENSITIVE aşağıdaki bağımsız değişkenleri nasıl yapabilirim , böylece ben gerçekleştirmek cd BackupDirectoryveya cd backupdirectoryBackupDirectory dizin adını girebilirsiniz önerebilir miyim .

Tabii ki, diğer kullanıcılar için işleri vidalamak istemiyorum, bu yüzden yukarıdakiler mümkünse, değişikliğin sadece kullandığım oturuma uygulanabilmesi ve diğer kullanıcıları etkilememesi mümkün mü?

Tamam, denedim set completion-ignore-caseama bu işe yaramıyor. Sadece ben yazın cd bve / Tabveya Esc Escdavayı görmezden dizin adını doldurursa yardımcı olur . Ama ihtiyacım olan şey, eğer ben yaparsam cd backupdirectory, sadece davayı görmezden gelir ve BackupDirectorykendi kendine girer .


Belirsizlikten nasıl kaçınacaksınız? Eğer varsa backUPve backUpnasıl olacağını backuphiç hangi dizin için gitmek istediğiniz?
Bernhard

Hangi kabuğu kullanıyorsunuz?
Gert van den Berg

mcGUI gibi bir araç kullanmayı veya GUI'ye geçmeyi düşündünüz mü ? Hayatı kolaylaştırır.
ott--

Yanıtlar:


17

Etkinleştirme cdspellyardımcı olacaktır:

shopt -s cdspell

Sayfadan man:

cdspell Ayarlanırsa , cd komutundaki bir dizin bileşeninin yazımındaki küçük hatalar düzeltilir. Kontrol edilen hatalar, aktarılmış karakterler, eksik bir karakter ve bir karakterdir. Bir düzeltme bulunursa, düzeltilen dosya adı yazdırılır ve komut devam eder. Bu seçenek yalnızca etkileşimli kabuklar tarafından kullanılır.


Değişikliğin yürürlüğe girmesi için bu komutu çalıştırdıktan sonra herhangi bir şey yapmanız gerekiyor mu?
Nathan Arthur

Ben sadece varsayıyorum çünkü sadece shopt -s cdspell girmek benim için bir şey yapmıyor
sdfsdf

10

darbe

set completion-ignore-case oniçinde ~/.inputrc(veya bind 'set completion-ignore-case on'içinde ~/.bashrc) benim tavsiye olacaktır. Tam adı yazacaksanız, neden birkaç Shifttuşa basarsınız ?

Ancak gerçekten isterseniz, cdtam bir eşleşme için uğraşan bir sarıcı var ve eğer yoksa, büyük / küçük harfe duyarlı olmayan bir eşleşme arar ve benzersizse gerçekleştirir. Büyük / nocaseglobküçük harf duyarsız globbing için kabuk seçeneğini kullanır ve argümanı ekleyerek @()(hiçbir şeyle eşleşmez ve gerektirir extglob) bir glob haline getirir . extglobSeçenek aksi bash bile ayrıştırmak olamaz fonksiyonu tanımlarken açık olması gerekiyor. Bu işlev desteklenmiyor CDPATH.

shopt -s extglob
cd () {
  builtin cd "$@" 2>/dev/null && return
  local options_to_unset=; local -a matches
  [[ :$BASHOPTS: = *:extglob:* ]] || options_to_unset="$options_to_unset extglob"
  [[ :$BASHOPTS: = *:nocaseglob:* ]] || options_to_unset="$options_to_unset nocaseglob"
  [[ :$BASHOPTS: = *:nullglob:* ]] || options_to_unset="$options_to_unset nullglob"
  shopt -s extglob nocaseglob nullglob
  matches=("${!#}"@()/)
  shopt -u $options_to_unset
  case ${#matches[@]} in
    0) # There is no match, even case-insensitively. Let cd display the error message.
      builtin cd "$@";;
    1)
      matches=("$@" "${matches[0]}")
      unset "matches[$(($#-1))]"
      builtin cd "${matches[@]}";;
    *)
      echo "Ambiguous case-insensitive directory match:" >&2
      printf "%s\n" "${matches[@]}" >&2
      return 3;;
  esac
}

ksh

Ben oradayken, ksh93 için benzer bir işlev var. Büyük / ~(i)küçük harfe duyarlı olmayan eşleme için değiştirilen değişiklik /yalnızca dizinleri eşleştirmek için sonekle uyumsuz görünüyor (bu benim ksh sürümümde bir hata olabilir). Bu yüzden, dizin olmayanları ayıklamak için farklı bir strateji kullanıyorum.

cd () {
  command cd "$@" 2>/dev/null && return
  typeset -a args; typeset previous target; typeset -i count=0
  args=("$@")
  for target in ~(Ni)"${args[$(($#-1))]}"; do
    [[ -d $target ]] || continue
    if ((count==1)); then printf "Ambiguous case-insensitive directory match:\n%s\n" "$previous" >&2; fi
    if ((count)); then echo "$target"; fi
    ((++count))
    previous=$target
  done
  ((count <= 1)) || return 3
  args[$(($#-1))]=$target
  command cd "${args[@]}"
}

zsh

Son olarak, burada bir zsh sürümü var. Yine, büyük / küçük harfe duyarsız tamamlamaya izin vermek muhtemelen en iyi seçenektir. Tam ayar eşleşmesi yoksa aşağıdaki ayar büyük / küçük harf duyarsız globbing'e geri döner:

zstyle ':completion:*' '' matcher-list 'm:{a-z}={A-Z}'

''Tam büyük / küçük harf eşleşmesi olsa bile büyük / küçük harfe duyarlı olmayan eşleşmeleri göstermek için kaldırın . Bunu, menü arayüzünden ayarlayabilirsiniz compinstall.

cd () {
  builtin cd "$@" 2>/dev/null && return
  emulate -L zsh
  setopt local_options extended_glob
  local matches
  matches=( (#i)${(P)#}(N/) )
  case $#matches in
    0) # There is no match, even case-insensitively. Try cdpath.
      if ((#cdpath)) &&
         [[ ${(P)#} != (|.|..)/* ]] &&
         matches=( $^cdpath/(#i)${(P)#}(N/) ) &&
         ((#matches==1))
      then
        builtin cd $@[1,-2] $matches[1]
        return
      fi
      # Still nothing. Let cd display the error message.
      builtin cd "$@";;
    1)
      builtin cd $@[1,-2] $matches[1];;
    *)
      print -lr -- "Ambiguous case-insensitive directory match:" $matches >&2
      return 3;;
  esac
}

1
Bu harika. Ancak inputrcçalışması için eklemeniz gerekecek . Bunun gibi:echo "set completion-ignore-case on" >> ~/.inputrc
jsejcksn

@JesseJackson Evet, burada dolaylıydı çünkü asker zaten biliyordu, ancak gelecekteki ziyaretçiler için cevabımı ekleyeceğim.
Gilles 'SO- kötü olmayı kes'

Bununla cd kullanmayı denerken aşağıdaki hatayı alıyorum: cd:cd:17: no such file or directory: videos(Ben bir dir adı var Videos)
Sridhar Sarnobat

@ user7000 Hangi sürüm, hangi kabuk altında?
Gilles 'SO- kötü olmayı kes'

1
@ user7000 Benim için zsh 5.0.7 altında çalışır. Belki de globbing'in çalışma şeklini değiştiren bir seçenek belirlediniz? Değiştirmek eğer yardım mı emulate -L zshetmek emulate -LR zsh? (Olmalıydı Ben sadece bir hata düzeltildi arada, emulate -L zshdeğil emulate zsh, aksi takdirde altüst kabuk seçenekleri olur.)
Gilles 'SO dur olma kötülük'
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.