2014-12-22 25 views
5

Kodumun tamamı bilgisayarım/a/b/c/d/e/myCode öğesinde aşağıdaki dizinde bulunur. Ben proje1 derlemek istediğimde make/a/b/c/d/e/myCode/project1 yazarak rahatsız oldum.İşlev bağımsız değişkenleri için çalışma dizinini ayarlama

function make_project { make /a/b/c/d/e/myCode/$1; } 

Sonra böyle diyoruz:

make_project project1 

Bu iyi çalışır Bunu düzeltmek için ben şöyle görünüyor benim bashrc bir işlev yarattı. Bununla ilgili tek sorun, proje1 için otomatik tamamlama olmamam. Öyleyse, eğer benim komplike bir ismim varsa, my_complicatedly_named_project gibi bir isme sahip olsaydım, ismin tamamını yazmam gerekecek. Bashın argümanların/a/b/c/d/e/myCode/dizininde olduğunu bilmenin bir yolu var mı? uygun şekilde otomatik tamamlanabilir?

+0

bakınız [ "Meli sorular şunlardır:“Bu -S seçeneğiyle kombine edilirse tamamlamaları dizin adları gibi görünebilir sonra bir sonek karakteri eklemek compgen ve kolayca alt ağacı yürümek mümkündür etmek “kendi başlıklarında etiketler” (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), burada fikir birliği "hayır, olmamalıdır"! –

+0

Teşekkürler, bilmek güzel. –

cevap

2

yazdıktan sonra da kullanabilirsiniz. Tamamlama oluşturmak ve test etmek için compgen komutu kullanılabilir ve varolan tamamlamalara bakmak yeni yardımlar oluşturmaya yardımcı olabilir.

function _make_project { 
    COMPREPLY=($(cd /a/b/c/d/myCode; compgen -A directory -- "${COMP_WORDS[COMP_CWORD]}")); 
} 

Bu renklendireceğinizi alt ağaç başlayarak geçerli argüman tamamlamak olabilir dizinleri elde etmek compgen kullanır: Belirli bir alt ağacındaki dizinleri şu bash çalışması gerekir böylece sonra bulunmaktadır. sizin fonksiyonu için bu yüklemek için bash işlevi ile bu tamamlama fonksiyonu ilişkilendirmek için complete komutu kullanmalısınız:

complete -F _make_project make_project 

kaydederken

tamamlanan çalışma, eklenen bir boşluk karakteri önlemek için Güncelleştirme Tamamlama işlevi nospace seçeneği sağlanabilir.

function _make_project { 
    COMPREPLY=($(cd /a/b/c/d/myCode; compgen -S/-A directory -- "${COMP_WORDS[COMP_CWORD]}")); 
} 
complete -o nospace -F _make_project make_project 
+0

Bu işe yaradı. –

+0

Şimdi otomatik tamamlamalarda sekmeye bastığımda küçük bir soru, ancak daha sonra bir boşluk ekler. Bu yüzden bir alt dizin istiyorsanız geri tuşuna basmalıyım ve sonra /. Otomatik tamamlama için alan eklememenin bir yolu var mı? –

+0

Düzenleme re: nospace seçeneğine bakın. – patthoyts

0

Bash'in bunu yapıp yapamayacağını bilmiyorum ama zsh bunu makul bir şekilde yapabilir. Bunun İstediğin cevap değil biliyorum ama tarihi:

#compdef make_project 

# _arguments "1: :(World)" 

_make_project() { 
    # Note: Do the following two lines mean anything?: 
    local curcontext="$curcontext" state line 
    typeset -A opt_args 

    for dir in /a/b/c/d/e/myCode/*(/); do 
     compadd "[email protected]" "${dir/*\//}" 
    done 
} 

Not:

fpath=(~/.zshcompletion $fpath) 

Ardından dosyayı ~/.zshcompletion/_make_project oluşturun: zsh bu işi yapmak için .zshrc için bu satırı ekleyin zsh temel olarak bash ile aynı kullanıcı arabirimine sahiptir (betikler genellikle uyumludur), kolay bir bash çözümü olmadığında yararlı olabileceğini düşündüm.

+0

Bu işe yarayıp yaramadığını göreceğim. –

+0

Rica ederim. Bu, üzerinde çalıştığım projeye dayanarak bazı ortam öğelerini ayarlamak istediğim durumuma oldukça benziyor, ancak klasör adı gerçekten tek önemli veri parçasıydı. Bunu nasıl yapacağımı anladım ve umarım bir daha asla anlamayacağım. :) – piojo

0

myCode dizini için yumuşak bir bağlantı kullanın. Ben ek myCode çok fazla zarar vermez yazarak varsayalım

function make_project { make $1; } 

:

ln -s /a/b/c/d/e/myCode/ ~/myCode 

için işlevini değiştirin

make_project ~/myCode/project_name 

ya da sadece kullanmak make:

make ~/myCode/project_name 

Otomatik tamamlamayı, ~/myCode/

İlgili konular