zakończenie zsh dla wszystkich plików wykonywalnych na ścieżce

0

Napisałem skrypt, który sam przyjmuje za argument dowolny dowolny plik wykonywalny w mojej $ PATH. Czy istnieje sposób na utworzenie funkcji uzupełniania zsh (lub bash), na której można by pisać myFunc to[Tab]i myFunc topna przykład, aby się uzupełniał ? Preferowane byłoby wybranie tylko plików z uprawnieniami do wykonywania, ale posiadanie dowolnego pliku w $ PATH byłoby więcej niż pomocne!

Nie mogę sobie wyobrazić, że system miałby znaczenie, ale działałoby to na Linuksie, BSD i Macu.

Dzięki!

ebrious
źródło

Odpowiedzi:

2

zshma funkcję uzupełniania poleceń w PATHnazwie _path_commands. Możesz skonfigurować zakończenie, aby go używać, myFuncuruchamiając:

compdef _path_commands myFunc

Uwaga: wymaga to zainicjowania systemu uzupełniania zsh . Zwykle (zgodnie z konfiguracją compinstall) dzieje się to w twoim ~/.zshrcprzypadku

# some zstyle configurations

autoload -Uz compinit
compinit

Wszelkie połączenia compdefnależy wykonać po compinit. Jeśli podczas działania występują błędy „nie znaleziono polecenia” compdef, sugeruję skonfigurowanie systemu uzupełniania za pomocą compinstall.

Uwaga: ze względów bezpieczeństwa, zsh zgłasza błędy, jeśli dowolne katalogi w $ fpath są dostępne do zapisu na całym świecie. Jeśli pojawi się błąd:

zsh compinit: niezabezpieczone katalogi, uruchom compaudit dla listy. Zignorować niepewne katalogi i kontynuować [y] czy przerwać wykonywanie [n]?

Nie po prostu naciśnij y, ale naciśnij n, a następnie spróbuj, compaudit | xargs chmod g-wjak sugerowano na https://stackoverflow.com/questions/13762280/zsh-compinit-insecure-directories

Adaefon
źródło
Świetny! Dziękuję Ci! To działało idealnie. Widziałem także, że niektóre osoby używają katalogu „uzupełnienia” do przechowywania różnych heurystyk uzupełniania. Czy to jest zgodne z tym paradygmatem? Jeśli mają być dodane bardziej złożone uzupełnienia, czy na ogół są one wyłączone z .zshrc? Dzięki jeszcze raz!
ebrious
Usunąłem zaakceptowany tag odpowiedzi, ponieważ na Linuksie (ale co ciekawe, nie na Macu) próba wykonania dowolnej funkcji, która nie jest myFunc, powoduje błąd „_complete: 96: złe wyrażenie matematyczne: operand oczekiwany w„ ”Przykład pisania ls [Tab] poda ten błąd
ebrious
Testowałem to w systemie Linux. Ubuntu 14.04 z zsh 5.0.5, Arch Linux z zsh 5.0.6, a teraz nawet TomatoUSB z zsh 4.3.17 (alternatywne oprogramowanie routera z opcją ddwrt z nslu2). Z moją własną konfiguracją, a także bez konfiguracji ( zsh -f). Działało dobrze w każdym przypadku, nie psując innych uzupełnień. Może sugeruję, że coś jest nie tak z zsh na twoim komputerze z Linuksem, albo w konfiguracji, albo w zainstalowanym pakiecie. Czy wszystko działa na twoim Linuksie, jeśli po prostu pominiesz compdef _path_commands myFunc?
Adaephon
Ponownie zaakceptuję twoją odpowiedź, ponieważ znalazłem niezbędne zmiany, aby działała. Moja konkretna konfiguracja zsh zawierała w katalogu fpath kilka katalogów, które miały uprawnienia do zapisu, co spowodowało błąd: „zsh compinit: niezabezpieczone katalogi, uruchom compaudit dla listy. Zignoruj ​​niepewne katalogi i kontynuuj [y] czy przerwać compinit [n]?”. Wystarczy, że naciśniesz „y”, to problem, który miałem z twoją odpowiedzią. Running "compaudit | xargs chmod GW" jak sugeruje stackoverflow.com/questions/13762280/solved problem. Czy mogę zasugerować edycję odpowiedzi, aby uwzględnić tę możliwość / rozwiązanie?
ebrious