Autocomplete auch für pkg einrichten

Sloop

Well-Known Member
Hallo Devil-Freunde,

ich habe in meiner cshrc einige Autocomplete Funktionen eingebaut, die ich damals von einer BSD-HowTo übernommen hatte. Das funktioniert soweit so gut, bloss mir fehlt das autocompletion für den pkgng. Hat das jemand schon gemacht und könnte das hier sharen? müßte das in etwa so aussehen??

set pkg_cmds = (query install search remove und viele viele mehr)
complete pkg 'p/1/$pkg_cmds/'

für meine alten pkg_kommandos hatte ich bisher genutzt (Bsp. am pkg_delete)
Code:
complete pkg_delete 'p#*#`ls /var/db/pkg`#'

Das kann ich ja aber nicht mehr so nutzen, denn sofern ich mich recht erkundigt habe, verwendet pkgng die SQLite als Datenbank, oder?

Freue mich auf eure Tips und Vorschläge.

EDIT:
Ich glaub ich hab's :-) So sieht meine cshrc aus...

Code:
[...]
set pkg_cmds =  (add audit autoremove backup check clean create delete fetch \
		  help info install query register remove repo rquery search set \
		shell shlib stats update updating upgrade version which)
complete pkg 'p/1/$pkg_cmds/' \
'n/audit/`pkg query "%n-%v"`/' \
'n/help/$pkg_cmds/' \
'n/info/`pkg query "%n-%v"`/' \
'n/update/x: -q  Force quiet output | -f  Force a full download/' \
'n/which/f/' \
[...]

Wer möchte kann statt dem %n-%v beliebige Platzhalter verwenden. Hilfe gibts dafür in 'man pkg'.

Funktioniert erste Sahne soweit *freu*

Grüße,
Sloop.
 
Zuletzt bearbeitet:
jo, ich hab 'n Haufen davon, die mir die Arbeit erleichtern. Momentan kämpfe ich mit tmux autocompletion :)
 
Ich kann da nur zu zsh mit grml config raten. Die macht alles was man will, unterstützt auch FreeBSD-spzifische Befehle, wobei pkg noch nicht eingezogen ist, glaube ich...
 
Was ist die grml config h^2 ? Ich kenne grml als dieses Sysutil-Boot-Tool (kleiner als Knoppix). Oder meinst du jetzt was ganz anderes damit? würde mir das gerne näher anschauen...
 
Code:
# man, where, whereis and which
complete {man,where,whereis,which} 'p/*/c/'

# exec
complete exec 'p/1/c/'

# jobs
complete -%* 'c/%/j/'

# fg, bg and stop
complete {fg,bg,stop} 'c/%/j/ p/1/"(%)"//'

# kill
complete kill 'c/-/S/' 'c/%/j/'

# svn
set svn_cmds=(add annotate blame cat checkout cleanup commit \
     copy delete diff export help import info list log merge mkdir move \
     patch pdel pedit pget plist praise propdel propedit propget proplist \
     propset pset remove rename resolved revert status stat switch \
     update upgrade)
set svnadmin_cmds=(create deltify dump help hotcopy list-dblogs \
     list-unused-dblogs load lstxns recover rmtxns setlog verify)
set svnsync_cmds=(init sync copy-revprobs info help)
complete svn 'p/1/$svn_cmds/'
complete svnadmin 'p/1/$svnadmin_cmds/'
complete svnsync 'p/1/$svnsync_cmds/'

# git
set git_cmds=(add add--interactive am annotate apply archimport archive bisect \
    bisect--helper blame branch bundle cat-file check-attr check-ref-format \
    checkout checkout-index cherry cherry-pick citool clean clone commit commit-tree \
    config count-objects credential-cache credential-cache--daemon credential-store \
    cvsexportcommit cvsimport cvsserver daemon describe diff diff-files diff-files \
    diff-index diff-tree difftool difftool--helper fast-export fast-import fetch \
    fetch-pack filter-branch fmt-merge-msg for-each-ref format-patch fsck fsck-objects \
    gc get-tar-commit-id grep gui gui--askpass hash-object help http-backend imap-send \
    index-pack init init-db instaweb log lost-found ls-files ls-remote ls-tree mailinfo \
    mailsplit merge merge-base merge-file merge-index merge-octopus merge-one-file \
    merge-ours merge-recursive merge-resolve merge-subtree merge-tree mergetool mktag \
    mktree mv name-rev notes pack-objects pack-redundant pack-refs patch-id peek-remote \
    prune prune-packed pull push quiltimport read-tree rebase receive-pack reflog \
    relink remote remote-ext remote-fd remote-testgit repack replace repo-config \
    request-pull rerere reset rev-list rev-parse revert rm send-email send-pack \
    sh-i18n--envsubst shell shortlog show show-branch show-index show-ref stage \
    stash status stripspace submodule svn symbolic-ref tag tar-tree unpack-file \
    unpack-objects update-index update-ref update-server-info upload-archive \
    upload-pack var verify-pack verify-tag web--browse whatchanged write-tree)
complete git 'p/1/$git_cmds/'

# FreeBSD specific completions
if("${OSTYPE}" == "FreeBSD") then

    # portsnap
    set portsnap_cmds = (extract fetch update)
    complete portsnap 'p/1/$portsnap_cmds/'

    # portmaster
    complete portmaster 'c/--/(force-config show-work clean-distfiles \
        clean-distfiles-all check-depends help version)/'

    # pkg_create, pkg_delete and pkg_version
    complete pkg_create 'p#*#`ls /var/db/pkg`#'
    complete pkg_delete 'p#*#`ls /var/db/pkg`#'
    complete pkg_version 'p#*#`ls /var/db/pkg`#'

    # pkg
   set pkg_cmds=(add audit autoremove backup check clean create delete \
        fetch help info install query register remove repo rquery search \
        set shell shlib stats update updating upgrade version which)
    complete pkg 'p/1/$pkg_cmds/' \
        'n/delete/`pkg query "%n-%v"`/' \
        'n/help/$pkg_cmds/' \
        'n/install/`pkg rquery "%n-%v"`/' \
        'n/remove/`pkg query "%n-%v"`/'

    # kldload and kldunload
    complete kldload 'n@*@`ls -1 /boot/modules/ /boot/kernel/ | awk -F/ \$NF\ \~\ \".ko\"\  ->   \{sub\(\/\.ko\/,\"\",\$NF\)\;print\ \$NF\} |sed "s/\*//"`@'
    complete kldunload 'n@*@`kldstat | awk \{sub\(\/\.ko\/,\"\",\$NF\)\;print\ \$NF\} |     ->   grep -v Name`@'

    # sysctl
    complete sysctl 'n/*/`sysctl -Na`/'

    # truss
    complete truss 'p/1/c/'

endif
[/code]
 
Na da lasse ich mich doch nicht lumpen, hier ist meine Mercurial config:
Code:
# Mercurial commands and options
alias _comp_hg_options hg -v help `echo \$COMMAND_LINE:s/hg //:as/\ /./:ar` \
	\|\& awk '/options:/,/\\\$/'
complete 'hg' \
	'p,1,`hg help | awk \/^\ /\{print\ \$1\}`,' \
	'n,help,`hg help | awk \/^\ /\{print\ \$1\}`,' \
	'n,--rev,`hg log | awk \/^changeset:/\{print\ \$2\}`,' \
	'n,-r,`hg log | awk \/^changeset:/\{print\ \$2\}`,' \
	'C,-,`_comp_hg_options`,'
 
Hier ist noch was fuer ssh, welches die hosts aus der .ssh/known_hosts liest:
Code:
# ssh
set hosts = `cut -d " " -f 1 $HOME/.ssh/known_hosts | grep -vE "^\["`
complete ssh 'p/*/$hosts/'

Fuer gcc, iverilog usw hab ich auch noch was, aber nicht auf meinem Laptop, den ich anscheinend lange nicht mehr synchronisiert habe. O.o
 
Ich habe mal auf s-tlk's Beispiel aufgebaut:
Code:
# SSH
alias _comp_ssh_hosts cut -d\\\  -f1 ~/.ssh/known_hosts \| sed \"s/\[\]\[\]//g\"
complete 'ssh*' \
	'n,-[iF],f,' 'c,-[iF],f,' \
	'c,*@,`_comp_ssh_hosts`,' \
	'C,*,`_comp_ssh_hosts`,'
Die Variante verwendet immer die aktuelle hosts Liste (statt der vom Loginzeitpunkt) und macht auch Vervollständigung wenn man einen Benutzernamen angibt. Die Optionen -i und -F nehmen eine Datei als Parameter.
 
Was ist die grml config h^2 ? Ich kenne grml als dieses Sysutil-Boot-Tool (kleiner als Knoppix). Oder meinst du jetzt was ganz anderes damit? würde mir das gerne näher anschauen...

Ja, die GRML Leute pflegen eine ziemlich geniale ZSH-Config, die natürlich unabhängig von grml läuft (gibt für andere OS auch pakete, nur für die Config). Man findet die hier:
http://grml.org/zsh/

Die macht eigentlich alles richtig gut, einer schöner Prompt, auto-completion für alles (ssh-domains, usernames, Parameter vonProgrammen...), hat CSH-like history completion, case-auto-correction, und typo-auto-correction. Wobei letztere das einzige ist, was mich manchmal ein bisschen nervt...

Kann ich auf jeden Fall allen empfehlen, die einfach eine gute Shell haben wollen, ohne sich selbst die Interna einarbeiten zu müssen. Ach ja, und die ZSH ist SH-kompatibel, so dass man im Gegensatz zur CSH, nicht zwei Sprachen für kleinere Schleifen und code-snippets auf der Kommandozeile lernen muss.
 
Bei csh basierten Shells muss man das ja auch nicht, wenn man nicht moechte. ;)
Allerdings kennt wohl jeder die C-Syntax fuer Schleifen, oder?

Ich habe mal auf s-tlk's Beispiel aufgebaut:
Code:
# SSH
alias _comp_ssh_hosts cut -d\\\  -f1 ~/.ssh/known_hosts \| sed \"s/\[\]\[\]//g\"
complete 'ssh*' \
	'n,-[iF],f,' 'c,-[iF],f,' \
	'c,*@,`_comp_ssh_hosts`,' \
	'C,*,`_comp_ssh_hosts`,'
Die Variante verwendet immer die aktuelle hosts Liste (statt der vom Loginzeitpunkt) und macht auch Vervollständigung wenn man einen Benutzernamen angibt. Die Optionen -i und -F nehmen eine Datei als Parameter.
Das ist auch nicht schlecht. Ich benutze aber eigentlich immer -l <user> fuer den Usernamen. Fuer scp habe ich natuerlich noch was aehnliches.

Wer noch mehr Beispiele sehen moechte, der kann mal in: /usr/share/examples/tcsh/complete.tcsh
 
hört sich gut an. Jetzt würde ich noch gerne wissen ,wie die zsh ssh completion machen kann. Braucht man dafür nicht hinterlegte keys ? oder wird nur aus gecachtem Inhalt gelesen?
 
Ich fürchte wir sind hier etwas abgeschweift und haben Deinen Thread entführt.

So langsam denke ich, dass es sich lohnt eine Sammlung zu machen und einen Port daraus zu basteln.
 
Gibts ja mehr oder weniger: shells/tcshrc

Da sind ne Menge Autovervollständigungen drin.
 
Zurück
Oben