Téma Jannah Licencia nie je overená. Prejdite na stránku možností témy a overte licenciu. Pre každý názov domény potrebujete jednu licenciu.

Ako nastaviť automatické dopĺňanie príkazov v termináli pre aplikácie príkazového riadka

Ako pridať dokončovanie terminálu do aplikácií príkazového riadka

Ručné zadávanie príkazov v Termináli môže byť zdĺhavé, najmä v aplikáciách príkazového riadka, ktoré vyžadujú viacero možností. Jednoduché preklepy narúšajú proces a spomaľujú pracovný postup. Tu prichádza na rad funkcia automatického dokončovania, ktorá vám šetrí čas a znižuje počet chýb. Povolenie tejto funkcie vám umožňuje vykonávať príkazy rýchlejšie, pretože Terminál navrhuje dostupné možnosti a dokončuje ich za vás jediným stlačením tlačidla.

terminálové okno zobrazujúce stránku s manuálom pre e-mailového klienta Mutt v systéme Linux Ako nastaviť automatické dopĺňanie príkazov terminálu pre aplikácie príkazového riadka

Automatické dopĺňanie je skvelý spôsob, ako si sprístupniť vlastné nástroje. Naučte sa, ako začať vytvorením jednoduchého skriptu automatického dopĺňania v jazykoch Bash a ZSH.

Obsah

Ako funguje automatické dopĺňanie tabulátora?

Automatické dopĺňanie – prítomné všade, od aplikácií na odosielanie textových správ až po integrované vývojové prostredia – sa môže zdať ako relatívne nedávna inovácia, ale v rôznych unixových systémoch je prítomné už od začiatku 80. rokov, ak nie skôr. Rozhrania Linuxu, ako napríklad bash a zsh, podporujú výkonnejší systém automatického dopĺňania, než by ste očakávali.

Automatické dopĺňanie pomocou tabulátora sa často používa s príkazmi a názvami súborov. Automatické dopĺňanie pomocou tabulátora funguje tak, že skúma premennú prostredia PATH a identifikuje dostupné príkazy, ktoré začínajú zadanými znakmi. Automatické dopĺňanie názvu súboru poskytuje zvyšok cesty k súboru (absolútnu alebo relatívnu) a pomáha vám zúžiť možnosti, čím rieši akékoľvek nejasnosti počas písania. Obe funkcie vám ušetria veľa času a manuálneho písania.

Existuje však aj tretí typ dopĺňania, možno menej bežný, ale možno výkonnejší ako bežnejšie typy. Automatické dopĺňanie argumentov sa vzťahuje na všetko, čo nasleduje za názvom príkazu, ako sú napríklad možnosti alebo podpríkazy.

linux-git-check-tab-complete Ako nastaviť terminál tak, aby automaticky dokončoval príkazy aplikácie z príkazového riadka

Ako pridať dokončovanie do skriptov

Najprv vysvetlím, ako pridať vlastné dopĺňanie do zsh a potom popíšem jeho ekvivalent v bash.

Príklad príkazu

Ukážem dokončovanie argumentov vlastného príkazu pomocou jednoduchého skriptu, ktorý používam na správu svojho zoznamu úloh. Celý skript nie je príliš zložitý, ale tento úryvok sa zameriava na najdôležitejšie časti:

#!/usr/bin/env zsh

FILE="$HOME/.local/state/todos/data"

if [ "$#" -eq "1" ] && [ "$1" = "edit" ] ; then
    "${EDITOR:-vi}" "$FILE"
elif [ "$#" -eq "1" ] && [ "$1" = "help" ] ; then
    echo "Usage: $(basename $0) [ edit | help ]"
else
    <"$FILE" grep -v ^~
fi

Tento skript som uložil do súboru s názvom todos, takže nasledujúce príkazy teraz fungujú v mojom systéme:

  • úlohy: Vypíše obsah dátového súboru, ignorujúc riadky začínajúce znakom ~
  • pomoc s úlohami: Zobraziť použitie
  • úprava úloh: Otvorenie dátového súboru v editore
Prečítajte si tiež:  Ako jednoducho zistiť, aký typ grafickej procesorovej jednotky je nainštalovaný v systéme Linux

Je to jednoduché, hoci celý skript vykonáva nejakú dodatočnú prácu na udržiavanie samostatného súboru JSON pri úprave. Pre tento jednoduchý skript nemám manuálovú stránku a podpríkaz help je užitočný, ale chcel by som pridať dokončovanie argumentov, aby som mohol zistiť podpríkaz edit alebo iné podpríkazy, ktoré by som mohol pridať v budúcnosti.

radu
Funkcia todos v tejto ukážke nehrá rolu. Môžete vytvoriť prázdny skript s týmto názvom a pokiaľ je spustiteľný a nachádza sa vo vašej ceste PATH, návrhy automatického dopĺňania budú fungovať.

Vlastný skript na dokončenie

Skript automatického dopĺňania vyžaduje dve veci: nastavenie systému dopĺňania pre vaše príkazy pomocou vstavanej štruktúry a vytvorenie potenciálnych dopĺňaní.

V zsh je najjednoduchšia operácia dokončenia veľmi jednoduchá:

_complete_todos() {
    compadd help edit
}

autoload -Uz compinit
compinit
compdef _complete_todos todos

Funkcia _complete_todos je obslužný program, ktorý volá funkciu compadd na určenie návrhov. Funkcia compadd patrí do modulu compinit v Zsh. Každé slovo, ktoré odovzdáte ako argument funkcii compadd, predstavuje možné dokončenie. Pre jednoduchý skript, ako je tento príklad, môžete túto funkciu naprogramovať pomocou statického volania funkcie compadd.

Po definovaní funkcie skript načíta a spustí modul compinit pred volaním compdef, aby prepojil funkciu _complete_todos s príkazom todos.

Vyššie uvedený skript môžete umiestniť do súboru .zshrc alebo do akéhokoľvek iného zdrojového súboru. Môžete tiež použiť systém fpath v zsh na jeho uloženie do súboru začínajúceho podčiarkovníkom vo vhodnom adresári.

Prečítajte si tiež:  Najlepšie bezplatné Linuxové aplikácie, ktoré rýchlo zvýšia vašu produktivitu

Pre vývoj a testovanie môžete jednoducho spustiť vyššie uvedený kód priamo na príkazovom riadku. Keď skončíte, skúste zadať todos a otestovať správanie automatického dopĺňania.

Rozdiely v Bash

Bash sa výrazne líši, pokiaľ ide o dokončovanie. Najmä Zsh vám s tým veľmi nepomôže. Zatiaľ čo Zsh spracováva všetky návrhy sám, Bash očakáva, že vyberiete vhodné návrhy na základe toho, čo bolo napísané a kde bol stlačený Tab.

Zvážte jednoduchý ekvivalent vyššie uvedeného skriptu Zsh:

_complete_todos_bash() {
    COMPREPLY=(help edit)
}

complete -F _complete_todos_bash todos

Bash poskytuje kompletný príkaz namiesto metódy funkcie Zsh, takže nie je potrebné nič načítavať ani inicializovať. Obslužný program dokončovania nastaví známu premennú – COMPREPLY – namiesto iterácie cez návrhy. Táto premenná je pole Bash.

Ak otestujete tento skript v jazyku Bash, uvidíte, že zobrazuje všetky návrhy podpríkazov podľa očakávania:

$ todos <TAB>
help edit

Problém je v tom, že Bash sa vždy spolieha na váš procesor, aby poskytol všetky relevantné návrhy bez použitia vlastnej logiky. Tieto výsledky teda nie sú vždy užitočné:

$ todos he<TAB>
help edit

Je vašou zodpovednosťou povedať Bashu, že by mal ako možné doplnenie navrhnúť iba „pomoc“. Môžete to urobiť preskúmaním niektorých užitočných premenných, ktoré Bash poskytuje po stlačení klávesu Tab:

  • COMP_WORDS je pole obsahujúce celý príkazový riadok rozdelený na jednotlivé slová.
  • COMP_CWORD je index v COMP_WORDS, ktorý ukazuje na slovo, v ktorom sa kurzor aktuálne nachádza.

Pomocou týchto údajov môžete určiť, ktoré slovo sa dopĺňa, a poskytnúť kontextové návrhy. Hoci existujú spôsoby, ako to urobiť manuálne, Bash poskytuje ďalší užitočný príkaz, compgen. Tento príkaz dokáže vygenerovať mnoho typov návrhov na základe faktorov, ako sú dostupné funkcie alebo príkazy a doteraz napísané slovo. Voľba -W prehľadá pevný zoznam slov.

$ compgen -W "one two three" o
one
$ compgen -W "one two three" t
two
three

Takže môžete vložiť volanie funkcie compgen do obslužného programu návrhov a vychutnať si kontextovo špecifické, relevantné návrhy pomocou veľmi jednoduchého skriptu:

_complete_todos_bash() {
    COMPREPLY=( $( compgen -W "edit help" -- "${COMP_WORDS[$COMP_CWORD]}" ) )
}

complete -F _complete_todos_bash todos

Dať to všetko dokopy

Vlastné skripty budete pravdepodobne spúšťať v známom prostredí: buď Bash, alebo zsh. Pre prenosné skripty, ktoré možno budete chcieť zdieľať s ostatnými alebo používať na viacerých systémoch, budete musieť časť tohto kódu abstrahovať.

Prečítajte si tiež:  Prečo by sa mal Linux vzdať týchto 5 funkcií systému Windows

Tu je úplná kópia dokončovacieho skriptu, ktorý funguje v zsh alebo Bash, zadaním behového prostredia, v ktorom beží, a spustením príslušného kódu.

SUBCOMMANDS=(help edit halt)

_complete_todos_zsh() {
    compadd $SUBCOMMANDS
}

_complete_todos_bash() {
    COMPREPLY=( $( compgen -W "${SUBCOMMANDS[*]}" -- "${COMP_WORDS[$COMP_CWORD]}" ) )
}

if [ -n "${ZSH_VERSION:-}" ]; then
    autoload -Uz compinit
    compinit
    compdef _complete_todos_zsh todos
elif [ -n "${BASH_VERSION:-}" ]; then
    complete -F _complete_todos_bash todos
fi

Premenné prostredia ZSH_VERSION a BASH_VERSION deklarujú rozhranie, v ktorom práve pracujeme. Pamätajte, že rozhranie, v ktorom sa váš príkaz spúšťa, nie je dôležité; dôležité je tu rozhranie, ktoré volá systém dopĺňania, kde používateľ stlačil kláves Tab.

Tento skript ukladá svoje návrhy do premennej SUBCOMMANDS, ku ktorej majú prístup obe funkcie. Obe ju používajú na určenie podporovaných dokončovaní: zsh volaním funkcie compadd a Bash nastavením premennej COMPREPLY. Upozorňujeme, že Bash vyžaduje veľa syntaktických úprav typov na konverziu medzi poľami a reťazcami.

Vyššie uvedený skript môžete uložiť do jedného súboru – napríklad completion.sh – a potom získať zdrojový kód tohto súboru zo súborov .bashrc a/alebo .zshrc takto:

. /path/to/completion.sh

Ďalšie kroky

Prebrali sme iba základy vlastného dopĺňania príkazov shellu. Pomocou tohto jednoduchého skriptu môžete pridať dokončovania k pevnej sade jednoduchých podpríkazov, ale spúšťanie programov na príkazovom riadku ponúka oveľa viac možností, ktoré by ste mohli zvážiť.

Silný dokončovací skript musí brať do úvahy celý príkazový riadok, pretože iné argumenty môžu ovplyvniť ten, ktorý sa pokúšate dokončiť.

Pridanie dopĺňania príkazov do Terminálu je jednoduchý krok, ale výrazne zlepší používanie aplikácií príkazového riadka. Po jeho povolení si všimnete, že vykonávanie príkazov je rýchlejšie a presnejšie, čo vám umožní sústrediť sa na to najdôležitejšie bez toho, aby ste strácali čas opravovaním chýb alebo prepisovaním príkazov.

Prejsť na horné tlačidlo