Jak zmusić [TAB] do pracy z argumentami aliasów do autouzupełniania, jak można to zrobić za pomocą rzeczywistego polecenia

9

Mam wiele aliasów, które utworzyłem w swoim .bash_aliasespliku, i są one bardzo przydatne, więc jeśli chcę wszystkie informacje o pakiecie, robię coś takiego:

allinfo software-center

I to odpowiada:

apt-cache show software-center

Ponieważ alias jest ustawiony jako:

alias allinfo='apt-cache show'

Ale jest jedna wada tego, że obecnie nie jestem w stanie wykonać autouzupełniania, TABgdy używam allinfozamiast rzeczywistego polecenia. Zastanawiałem się więc, czy istnieje sposób na przezwyciężenie tej wady i sprawienie, aby robienie allinfo software-ce[TAB]działało tak samo, jak wtedy, gdy używasz go z rzeczywistym poleceniem, a nie tylko tworząc dużą przestrzeń tabulacji?

Używam gnome-terminal.


Informacje o systemie operacyjnym:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.04
Release:    15.04
Codename:   vivid

Informacje o paczce:

gnome-terminal:
  Installed: 3.14.2-0ubuntu3
  Candidate: 3.14.2-0ubuntu3
  Version table:
 *** 3.14.2-0ubuntu3 0
        500 http://gb.archive.ubuntu.com/ubuntu/ vivid/main amd64 Packages
        100 /var/lib/dpkg/status

źródło
To dobre pytanie. Podoba mi się pomysł. Rozglądałem się dookoła i znalazłem kilka bliskich odpowiedzi, ale zawiodły, gdy je wypróbowałem. Jeśli coś wymyślę, dam ci znać. =)
Terrance

Odpowiedzi:

6

Świetne pytanie! Jeśli twoje allinfopolecenie było takie samo, jak tylko apt-cache(tj. Bez show), moglibyśmy spojrzeć na zakończenie apt-cachei zastosować to do twojego allinfoaliasu.

Jednak chcesz podzbiór apt-cacheukończenia, więc mamy trochę więcej do zrobienia.

Jeśli spojrzymy w definicji zakończenia na apt-cache- w /usr/share/bash-completion/completions/apt-cache, zobaczymy, że dla showpodkomendy użyto następujących elementów :

        COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" 2> /dev/null ) )

- to tylko ustawienie COMPREPLYzmiennej na listę pasujących pakietów.

Możemy więc pożyczyć to i napisać własną funkcję i powiązać ją z aliasem allinfo:

# define a function to print the possible completions for
# an allinfo invocation
_allinfo()
{
    _init_completion || return
    COMPREPLY=($(apt-cache --no-generate pkgnames "$cur" 2>/dev/null))
    return 0
}

# bind the above completion function to the 'allinfo' alias
complete -F _allinfo allinfo

Jeśli dodasz tę frustrację do .bashrcpliku, ukończenia powinny działać zgodnie z oczekiwaniami.

Jeremy Kerr
źródło
0

Nie mam pojęcia bash, ale działa z zshniektórymi wtyczkami

Zainstaluj powłokę Z za pomocą

sudo apt-get install zsh

i ustaw Z-shell jako standardową powłokę

sudo chsh "$USER" -s $(which zsh)

i uruchom nowy terminal, aby korzystać z powłoki Z.

Dodaj antygen v1

cd
git clone https://github.com/zsh-users/antigen.git

I skonfiguruj

# path to antigen clone
source ~/antigen/antigen.zsh

# Load the oh-my-zsh's library.
antigen use oh-my-zsh

# Bundles from the default repo (robbyrussell's oh-my-zsh).
antigen bundle git
antigen bundle heroku
antigen bundle pip
antigen bundle lein
antigen bundle command-not-found
antigen bundle zsh-users/zsh-completions src

# Syntax highlighting bundle.
antigen bundle zsh-users/zsh-syntax-highlighting

# Load the theme.
antigen theme robbyrussell
# antigen bundle nojhan/liquidprompt

# Tell antigen that you're done.
antigen apply

Niektóre obrazy (monit to nojhan / liquidprompt)

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

AB
źródło
Ach, to działa tylko dla mnie, jeśli robię dokładnie tak jak ty, w przeciwnym razie zakładam, że działam cdi robi ścieżkę pliku. Jak mogę go odczytać .bash_aliases?
Próbowałem zainstalować te wtyczki, ale właśnie dostałem antigen: command not foundkonfigurację.