Komut takma adları için bash tamamlamasını nasıl alabilirim?


57

Komut satırı takma adlarımda sekme tamamlamayı düşünüyorum, örneğin, şu takma adı tanımladığımı söyleyin:

alias apt-inst='sudo aptitude install'

Sekme tuşuna bastığımda yetenek tarafından sağlanan tamamlamaları almanın bir yolu var mı? yani 'sudo yetenek yükleme gnumer' ve hit sekmesine yazdığımda, yetenek bunu gnumerik olarak tamamlar ya da belirsizlik varsa gnumer ile başlayan tüm mevcut paketleri listeler. Takma adımı kullanarak yaparsam, hiçbir şey - tamamlama yok.


Yanıtlar:


30

Orada Ubuntu forumlarında bu konuda büyük bir iş parçacığı . Ole J aşağıdaki takma adı tamamlama tanımı işlevini önermektedir:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

Takma adınız için bir tamamlama işlevi tanımlamak için kullanın, ardından bu işlevi takma ad için tamamlayıcı olarak belirtin:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

Var olan programlara her zaman kullanılan değişkenleri eklemek için takma adları kullanmayı tercih ederim. Mesela, grepben her zaman aygıtları ve ikili dosyaları atlamak istiyorum, bu yüzden bir takma ad yapıyorum grep. Yeni komutlar eklemek için klasörümde grepbinbir kabuk betiği kullanıyorum ~/bin. Bu klasör yolunuzdaysa, otomatik olarak tamamlanır.


2
Müthiş, mümkün olmayacağından korktum.
levesque,

Not bu kod bazı sorunlar vardır. Açıklamaları ve kararları için cevabımı gör.
Tom Hale,

Not: Bu tekniği başka bir komut için kullanıyordum ve dosya arşivi otomatik tamamlama gibi şeylerin argümanları geçerken doğru şekilde çalışmasını sağlamak complete -o default -F ...yerine kullanmak zorunda kaldım complete -F ...(Bash 4.3.46).
joelittlejohn

28

Bu sorunu tam olarak çözen tam diğer adı deneyin .

Yüklemeden sonra, bunun gibi birçok takma adı tamamlamak için bir genel işlev kullanabilirsiniz:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

Complete_alias dosyasını, her bash örneğinde aracılığıyla .bash_profileveya benzer şekilde kaynaklamak isteyebilirsiniz .

Kurulum

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

uygulama

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

containerorijinal _docker()tamamlama işleyicisi tarafından otomatik olarak tamamlanabilir;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

2
Bu yazılımın size ait olduğu göz önüne alındığında, bundan daha iyisini yapabilirsiniz. Yüklemeyle ilgili talimatları ekleyin. Ne yaptığını ve nasıl kullanılacağını açıklayın. Aksi takdirde bu sadece spam.
Aralık'ta muru

@muru Buraya bazı kodlar yapıştırmayı düşünüyordum ama muhtemelen burada kabul edilenden daha uzun. İnsanların bir README dosyasındaki Kurulum bölümünü okuma konusunda sorun yaşamadıklarını ve bu durumda sadece birkaç satır olduğunu varsayardım .
Cyker,

2
Mesele şu ki, söz konusu README’yi ziyaret etmenin sadece cevaptan değip değmeyeceğini yargılamak.
muru

Bu yeterli bir cevap ve sorunu tam olarak çözüyor.
Ярослав Рахматуллин

1
Bu mükemmel çalışan, mükemmel ve çok kapsamlı bir cevaptır, teşekkürler! Muhtemelen @muru'nun problemleri olduğu için güncellendi.
Brian Topping

3

2018 cevap

Takma adınızı 'complete' programına eklemelisiniz. Almak istediğiniz otomatik tamamlama türüne bağlı olarak, -c veya -F tuşlarını kullanmanız gerekir.

Paket otomatik tamamlama için:

complete -c name_of_your_alias

Komut otomatik tamamlama için:

complete -F name_of_your_alias

Takma adınızın doğru eklenip eklenmediğini kontrol etmek için:

complete | grep name_of_your_alias

Son olarak, bir takma adı 'tamamlandı' durumundan çıkarmak için:

complete -r name_of_your_alias

Senin durumunda:

complete -c apt-inst

1
Lütfen yorumlarınıza cevabınıza devam etmeyin. Söyleyeceğiniz şeyler varsa , cevabı düzenleyin .
G-Man

2
complete -F xxxOSX üzerinde çalışmaz (Sadece kullanımı gösterir complete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]). İşaretçiniz var mı? Teşekkürler.
Anthony Kong

Bunun yerine bunu kullanın: unix.stackexchange.com/questions/224227/…
Zengin

2

İşte Shawn J. Goff'un bazı iyileştirmelerle yanıtındaki kod :

  • Sabit sözdizimi hataları ile öne shell-checkbirinci örn "ait "$@"aslında sona İşlev tanımlarını.
  • return 0Alttaki işlevin dönüş değeri arayan kişiye geri verilebilecek şekilde kaldırıldı .

.

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper

Bash benim için çalışmıyor mu 4.3.46 Korkarım. Shaun J. Goff cevabı yok çalışır.
joelittlejohn

1
İşlev tanımı dizgesinin "Sonu" bilerek; nokta dış fonksiyondan COMP_WORDSdiziye argümanları dahil etmektir . Kullandığımız Eğer make-completion-wrapper _apt_get _apt_get_install apt-get installörnek olarak, sonra shift 2, $@içerdiği apt-get install. İşlev tanımı, apt-get installatama yaparken (iki gerçek kelime) içerir COMP_WORDS.
Jeffery,

0

@Giles'ın bir uzantısı olarak, aşağıdaki kolaylık işlevi, make-completion-wrappertamamlamayı bir satırda tanımlamayı mümkün kılmak için oluşturulan sargıcıyı otomatik olarak adlandırır :

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    AUTOGEN_COMPLETION_FN="__autogen_completion_${ALIAS}"
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
    complete -F ${AUTOGEN_COMPLETION_FN} ${ALIAS}
}
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.