Как заставить [TAB] работать с аргументами псевдонимов для автозаполнения, как это можно сделать с помощью фактической команды


9

У меня есть много псевдонимов, которые я создал в своем .bash_aliasesфайле, и они очень полезны, поэтому, если я хочу получить всю информацию о пакете, я делаю что-то вроде:

allinfo software-center

И это эквивалентно:

apt-cache show software-center

Поскольку псевдоним установлен как:

alias allinfo='apt-cache show'

Но в этом есть один недостаток, с которым я сейчас не могу выполнить автозаполнение TABпри использовании allinfoвместо самой команды. Поэтому мне было интересно, есть ли способ преодолеть этот недостаток и сделать так, чтобы выполнение allinfo software-ce[TAB]работало точно так же, как и при использовании его с фактической командой, а не просто при создании большого пространства табуляции?

Я использую gnome-terminal.


Информация об ОС:

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

Информация о пакете:

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

Это хороший вопрос. Мне нравится идея этого. Я искал все, и я нашел несколько близких ответов, но они терпят неудачу, когда я их пробую. Если я что-нибудь придумаю, я дам вам знать. =)
Терренс

Ответы:


6

Отличный вопрос! Если ваша allinfoкоманда была такой же, как и просто apt-cache(т.е. без show), то мы могли бы посмотреть на завершение apt-cacheи применить его к вашему allinfoпсевдониму.

Тем не менее, вы хотите подмножество apt-cacheзавершения, поэтому у нас есть немного больше работы.

Если мы посмотрим в определении завершения для apt-cache- in /usr/share/bash-completion/completions/apt-cache, то увидим, что для showподкоманды используется следующее :

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

- это просто установка COMPREPLYпеременной в список соответствующих пакетов.

Таким образом, мы можем позаимствовать это и написать собственную функцию и связать ее с псевдонимом 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

Если вы добавите этот .bashrcфайл в свой файл, вы должны получить завершение работы, как вы ожидаете.


0

Я понятия не имею bash, но он работает с zshнекоторыми плагинами

Установите z-shell с помощью

sudo apt-get install zsh

и установите z-shell в качестве стандартной оболочки

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

и запустить новый терминал для использования z-оболочки

Добавить антиген v1

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

И настроить

# 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

Некоторые изображения (подсказка nojhan / liquidprompt)

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


Ах, это работает только для меня, если я делаю точно так же, как вы, в противном случае это просто предполагает, что я работаю, cdи делает путь к файлу. Как мне заставить его читать .bash_aliasesфайл?

Я попытался установить эти плагины, но я только что antigen: command not foundнастроился.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.