Завершение строки с помощью пользовательских команд

мою программу Python можно запустить с помощью ряда различных опций (или подкоманд), например:

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

Я хочу, чтобы он использовал автозаполнение, чтобы, если я наберу «myProgram d», он вернет «myProgram doSomething», а если я наберу «myProgram n», он отобразит «myProgram nowDoSomethingDifferent». Это похоже на среднее использование модуля rlcompleter, но он выбирает возможные варианты завершения не из файловой системы (или из истории), а из настраиваемого набора строк (которые соответствуют доступным параметрам для моей программы)

Есть идеи, как это реализовать?

Мне известно о переменной PYTHONSTARTUP (которая должна указывать на файл, который я не знаю, как писать).

В качестве рабочего примера django-admin (из пакета django) имеет ту же самую функцию, которую я ищу.

это вопрос bash. Вам придется настроить bash, чтобы он работал. Это не имеет ничего общего с питоном.

nosklo 09.01.2009 16:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
29
1
11 345
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Насколько я знаю, PYTHONSTARTUP предназначен для выполнения команд, когда интерпретатор запускает [1]. rlcompleter предназначен для автозаполнения внутри вашего скрипта, если он использует библиотеку readline. Что-то вроде этого:

$ ./myscript.py
My Script version 3.1415.
Enter your commands:
myscript> B<TAB>egin
myscript> E<TAB>nd

В вашем примере вы хотите завершить в командной строке оболочка. Это автозаполнение является функцией оболочки (bash или zsh, что бы вы ни использовали). См., Например, введение в автодополнение bash (также часть 2). Для zsh см., Например, это руководство.

Если я правильно понимаю, вам нужно завершить строку в командной строке до запуска вашего скрипта python. Тогда вам не следует искать решение на Python, а следует изучить функции оболочки.

Если вы используете bash, вы можете посмотреть / etc / bash_completion, и, по крайней мере, на debian / ubuntu вы должны создать файл в /etc/bash_completion.d/, который определяет завершение для вашей программы.

+1. Я бы пошел на это. Если у вас есть конечный набор доработок, настроить его очень просто. И это дает пользователю интерфейс, к которому они привыкли.

PEZ 12.01.2009 18:27

Если вы хотите, чтобы ваша программа выбирала параметр командной строки, даже если вы использовали только сокращенную форму этого параметра, вам следует взглянуть на модуль optparse в стандартной библиотеке.

Ответ принят как подходящий

Создайте файл «myprog-Завершение.bash» и поместите его в свой файл .bashrc. Что-то вроде этого, чтобы вы начали ...

_myProgram()
{
  cur=${COMP_WORDS[COMP_CWORD]}
  case "${cur}" in
    d*) use = "doSomething" ;;
    n*) use = "nowDoSomethingElse" ;;
  esac
  COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o default -o nospace -F _myProgram  myProgram

Можно ли это использовать с псевдонимами? У меня есть суть, и я хочу автозаполнение на некоторых сайтах, таких как twitter google и т. д., Есть идеи?

Medet Tleukabiluly 26.06.2015 08:29

Существует модуль optcomplete, который позволяет вам писать автодополнение для bash в вашей программе на Python. Это очень полезно в сочетании с optparse. Вы определяете свои аргументы только один раз, добавьте следующее в свой .bashrc

complete -F _optcomplete <program>

и все ваши варианты будут заполнены автоматически.

optparse не является устаревшим и заменяется на argparse. Предпочитать argcomplete: github.com/kislyuk/argcomplete

user48956 31.10.2014 20:34

Как упоминалось в других ответах, в bash это можно сделать с помощью встроенного в bash complete. Проще, чем писать функцию (как в ответ Richq), использовать опцию complete-W, которая позволяет вам определять список слов. В вашем примере это будет:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

Поскольку это однострочный файл, вам не нужно создавать для этого файл, но вы можете просто поместить его в свой .bashrc.

Другие вопросы по теме