TAB автозаполнение Python CLI

Мне просто интересно, можно ли написать сценарий Python, который запускается в оболочке и может предлагать пользователю предложения, когда они нажимают Tab?

например, как определенные приложения могут ограничивать типы файлов, предлагаемые тем, что они поддерживают. Я не нашел ничего в optParse, что делает это?

В идеале было бы:

myScript.py [TAB] (оболочка выводит список опций)

Какие-либо предложения? В частности, используя KDE под OpenSuse и tcsh

Очень признателен


person Dhruv Govil    schedule 27.11.2012    source источник
comment
Взгляните на модуль cmd. В частности: docs.python.org/2/library/cmd. html#cmd.Cmd.completedefault   -  person mgilson    schedule 27.11.2012
comment
@KirkStrauser показывает способ сделать это с помощью readline здесь.   -  person unutbu    schedule 27.11.2012
comment
Кажется, что оба этих решения требуют, чтобы файл python выполнялся первым? Есть ли способ, которым я могу это сделать: › список решений myScript.py [TAB] Спасибо за ссылки. Полезно знать о тех.   -  person Dhruv Govil    schedule 27.11.2012


Ответы (4)


Это особенность оболочки, а не вызываемого скрипта Python. См. этот вопрос на SO для получения дополнительной информации о завершении оболочки. В частности, вы ищете программируемое завершение.

person Florian Brucker    schedule 27.11.2012
comment
Да, я подумал, что это может быть, но просто хотел проверить, возможно ли, чтобы все было включено. Спасибо! - person Dhruv Govil; 27.11.2012

Я думаю, вы ищете что-то вроде optcomplete. Он реализует модуль завершения для bash, который автоматически дополняет параметры для любой программы Python, использующей optparse. Вы можете извлечь из этого подсказки и преобразовать их в то, что вам нужно.

person Noufal Ibrahim    schedule 27.11.2012
comment
Это действительно выглядит полезным, как и compleat ниже. Я попробую это дома, где у меня есть bash/zsh, но в обозримом будущем работа строго tcsh. (Что неприятно, потому что у bash/zsh такие лучшие сообщества) - person Dhruv Govil; 27.11.2012
comment
Что ж, если у tcsh есть программируемое завершение, вы можете адаптировать optcomplete, который сделает вашу работу за вас. - person Noufal Ibrahim; 27.11.2012

Там довольно хорошее объяснение того, как это сделать для git. Я включаю его в строку, но кредит принадлежит первоначальному автору.

# Source this script in tcsh to setup shell completions
# for git. Completions are activated by typing or Control-D
# in the shell after entering a partial command.
#
# Usage:
# source git-completion.tcsh (e.g. in ~/.cshrc)
#
# Supported completions:
# git (lists git commands)
# git help (lists git commands)
# git branch (lists branch names)
# git checkout (lists branch names)
# git log (lists the most commonly used flags)
# git remote (lists git remote commands)
# git remote add|prune|rm|show|update
# (lists git remote names)
# In addition to entering where shown, you can enter it after
# typing part of the word, e.g. git branch bug to auto-complete
# branches starting with “bug”.
#
# Author: David Adler, David Aguilar

if ( -x /usr/bin/git) then
# Git is installed so define tcsh completions for it.

# List of known git subcommands
# This is a hard-coded list to avoid calling ‘git help’ at startup.
set __git_cmd_names = (add bisect blame branch checkout clone commit config \
diff diff-files difftool fetch grep gui init log merge mv pull push \
rebase reset rm show shortlog stash status tag)

alias __git_aliases ‘git config –get-regexp “alias.*” | sed -n “s,alias\.\([^ ]*\).*,\1,p”‘
alias __git_branches ‘git for-each-ref –format=”%(refname)” refs/heads refs/remotes | sed -e s,refs/remotes/,, | sed -e s,refs/heads/,,’
alias __git_origin_branches ‘git for-each-ref –format=”%(refname)” refs/remotes/origin | grep -v HEAD | sed -e s,refs/remotes/origin/,,’

# Define the completions (see the tcsh man page).
complete git \
‘p/1/`__git_aliases | xargs echo $__git_cmd_names`/’ \
“n/help/($__git_cmd_names)/” \
‘n/branch/`__git_branches | xargs echo -m -d`/’ \
‘n/config/(–global –get-regexp –list)/’ \
‘n/diff/`__git_branches | xargs echo –check –staged –stat — *`/’ \
‘n/difftool/`__git_branches | xargs echo –no-prompt –staged — *`/’ \
‘n/fetch/`git remote`/’ \
‘n/merge/`__git_branches`/’ \
‘n/log/`__git_branches | xargs echo — –name-only –name-status –reverse –committer= –no-color –relative –ignore-space-change –ignore-space-at-eol –format=medium –format=full –format=fuller`/’ \
‘n/stash/(apply list save pop clear)/’ \
‘n/push/`git remote`/’ \
‘N/push/`__git_origin_branches`/’ \
‘n/pull/`git remote | xargs echo –rebase`/’ \
‘n/–rebase/`git remote`/’ \
‘N/–rebase/`__git_origin_branches`/’ \
‘N/pull/`__git_origin_branches`/’ \
‘n/rebase/`__git_branches | xargs echo –continue –abort –onto –skip –interactive`/’ \
‘N/rebase/`__git_branches`/’ \
‘n/remote/(show add rm prune update)/’ \
‘N/remote/`git remote`/’ \
‘n/checkout/`__git_branches | xargs echo -b –`/’ \
‘N/-b/`__git_branches`/’
endif
person synthesizerpatel    schedule 27.11.2012
comment
Спасибо. Я посмотрю и посмотрю, смогу ли я заставить его работать на меня. Ваше здоровье - person Dhruv Govil; 27.11.2012

compleat включает завершение табуляции в bash с помощью простого описания использования. Синтаксис !command должен позволять динамически фильтровать имена файлов.

person jfs    schedule 27.11.2012
comment
Я мог бы попробовать настроить это дома, где у меня есть доступ к zsh и bash. Однако работа строго tcsh, и похоже, что она зависит от некоторых основ bash. - person Dhruv Govil; 27.11.2012