2014-09-22 5 views
5

Ich schreibe ein Befehlszeilentool in Python und mit Pip, um es zu verteilen. Ich habe einige Skripte geschrieben (eins für bash und eins für zsh), damit das Tool die Tab-Vervollständigung haben kann. Gibt es eine Möglichkeit, pip zu bekommen, um diese Skripte zu installieren, wenn jemand eine Pip-Installation durchführt?Pip installieren mit Shell-Abschluss

Zum Beispiel: Ich habe eine completion.bash Datei. Wenn jemand

tut pip mypackage

installieren Es wird auch die Bash-Datei beziehen.

Ich bin mir ziemlich sicher, dass ich dies für Linux und bash tun kann, indem Sie das Skript setzt in meinem data_files Abschnitt im setup.py-Skript.

data_file=[ 
    ('/etc/bash_completion.d', ['bin/completion.bash']) 
], 

Aber wie kann ich das tun, damit es plattform- und shellunabhängig ist? Ich brauche es für Mac/Linux in beiden Bash und Zsh. Wenn möglich, sogar Windows unterstützen.

Ist das möglich? Und wenn ja, wie?


Falls es darauf ankommt, hier ist meine Bash-Skript:

_foo_complete() { 
COMPREPLY=() 
local words=("${COMP_WORDS[@]}") 
local word="${COMP_WORDS[COMP_CWORD]}" 
words=("${words[@]:1}") 
local completions="$(foo completer --cmplt=\""${words[*]}"\")" 
COMPREPLY=($(compgen -W "$completions" -- "$word")) 
} 

complete -F _foo_complete foo 

ich es derzeit nur um installiere source completion.bash läuft

Antwort

2

Sie fragen verschiedene Fragen.

Erstens gibt es keine plattformübergreifende oder cross-shell-Lösung zum Definieren von benutzerdefinierten Shell-Vervollständigungen. Der von Ihnen gepostete funktioniert für bash, aber in tcsh zum Beispiel verwenden Sie den Befehl complete von tcsh, der anders funktioniert als der von bash.

Zweitens Beschaffung der Dateien, die diese Abschluss-Definitionen zum Zeitpunkt der pip install enthalten würde nicht viel Gutes. Die Vervollständigungen funktionieren möglicherweise in genau dieser Sitzung, aber was Sie wahrscheinlich wollen, ist, dass sie auch in zukünftigen Sitzungen (d. H. Shell-Aufrufe) wirksam werden. Dazu müssten Ihre Dateien bei jedem Start der Shell bezogen werden (z. B. von .bashrc, im Fall von bash).

Diese measn, dass „Installation“ Ihre Dateien einfach bedeuten, sie irgendwo, und was darauf hindeutet, den Anwender bringen, sollen sie von ihrer jeweiligen Punkt-rc-Datei beziehen. Selbst wenn Sie könnten, sollten Sie nicht versuchen, es "zu erzwingen". Geben Sie Ihren Benutzern die Option, das zu ihrer dot-rc-Datei hinzuzufügen, wenn sie möchten.

Der beste Ansatz wäre wahrscheinlich, in Ihrem Paket eine Completion-Definitions-Datei pro unterstützter Shell, z. complete.bash, complete.tcsh, und Gott weiß was für Windows (sorry, ich bin kein Windows-Benutzer).