Obslužný program goto shell umožňuje uživatelům přejít do aliasovaných adresářů a také podporuje automatické dokončování.
Jak to funguje
Než budete moci používat goto, musíte si zaregistrovat aliasy adresáře. Například:
goto -r dev /home/iridakos/development
pak přejděte do tohoto adresáře, např.:
goto dev
Automatické dokončování v goto
přejděte na přichází s pěkným skriptem pro automatické dokončování – kdykoli stisknete klávesu Tab po goo Bash nebo Zsh vás vyzve s návrhy aliasů, které jsou k dispozici:
$ goto
bc /etc/bash_completion.d
dev /home/iridakos/development
rubies /home/iridakos/.rvm/rubies
Instalace goto
Existuje několik způsobů, jak nainstalovat goto.
Prostřednictvím skriptu
Naklonujte úložiště a spusťte instalační skript jako superuživatel nebo root:
klon git https://github.com/iridakos/goto.git
cd goto
sudo ./install
Ručně
Zkopírujte soubor goto.sh někde ve vašem souborovém systému a přidejte řádek do vašeho .zshrc nebo .bashrc k jeho zdroji.
Pokud jste například umístili soubor do své domovské složky, vše, co musíte udělat, je přidat následující řádek do souboru .zshrc nebo .bashrc soubor:
source ~/goto.sh
MacOS Homebrew
Vzorec s názvem goto je k dispozici pro prostředí Bash v systému MacOS:
brew install goto
Přidat barevný výstup
echo -e "\$include /etc/inputrc\nset colored-completion-prefix on" >> ~/.inputrc
Poznámky:
- Po instalaci musíte restartovat prostředí.
- Musíte mít povolenou funkci dokončování Bash pro Bash v MacOS (viz tento problém).
- Můžete jej nainstalovat pomocí brew install bash-completion pokud ji nemáte povolenou.
Způsoby použití goto
Změnit na adresář s aliasem
Chcete-li přejít na adresář s aliasem, zadejte:
goto <alias>
Například:
goto dev
Zaregistrujte si alias
Chcete-li zaregistrovat alias adresáře, zadejte:
goto -r <alias> <directory>
nebo
goto --register <alias> <directory>
Například:
goto -r blog /mnt/external/projects/html/blog
nebo
goto --register blog /mnt/external/projects/html/blog
Poznámky:
- goo rozbalí adresářů, takže můžete snadno vytvořit alias vašeho aktuálního adresáře pomocí následujícího příkazu a automaticky bude přiřazen k celé cestě:
goto -r last_release .
- Stisknutím klávesy Tab za názvem aliasu získáte návrhy výchozího adresáře shellu.
Zrušení registrace aliasu
Chcete-li zrušit registraci aliasu, použijte:
goto -u <alias>
nebo
goto --unregister <alias>
Například:
goto -u last_release
nebo
goto --unregister last_release
Poznámka: Stisknutím klávesy Tab po příkazu (-u nebo --zrušte registraci ), dokončovací skript vás vyzve k zobrazení seznamu registrovaných aliasů.
Vypsat aliasy
Chcete-li získat seznam aktuálně registrovaných aliasů, použijte:
goto -l
nebo
goto --list
Rozbalte alias
Chcete-li rozšířit alias na jeho hodnotu, použijte:
goto -x <alias>
nebo
goto --expand <alias>
Například:
goto -x last_release
nebo
goto --expand last_release
Vyčištění aliasů
Chcete-li vyčistit aliasy z adresářů, které již nejsou přístupné ve vašem souborovém systému, použijte:
goto -c
nebo
goto --cleanup
Získat nápovědu
Chcete-li zobrazit informace nápovědy nástroje, použijte:
goto -h
nebo
goto --help
Zkontrolujte verzi
Chcete-li zobrazit verzi nástroje, použijte:
goto -v
nebo
goto --version
Před změnou adresářů stisknout
Chcete-li před změnou adresářů přesunout aktuální adresář do zásobníku adresářů, zadejte:
goto -p <alias>
nebo
goto --push <alias>
Vrátit se do dodaného adresáře
Chcete-li se vrátit do předávaného adresáře, zadejte:
goto -o
nebo
goto --pop
Poznámka: Tento příkaz je ekvivalentní příkazu popd ale v rámci goto příkaz.
Odstraňování problémů
Pokud se zobrazí chyba příkaz nebyl nalezen:compdef v Zsh to znamená, že musíte načíst bashcompinit . Chcete-li tak učinit, připojte toto ke svému .zshrc soubor:
automatické načtení bashcompinit
bashcompinit
Zapojte se
Nástroj goto je open source za podmínek licence MIT a příspěvky jsou vítány. Chcete-li se dozvědět více, navštivte sekci Přispívání v úložišti GitHub goto.
Skript goto
goto()
{
místní cíl
_goto_resolve_db
if [ -z "$1" ]; potom
# zobrazení použití a ukončení, když nejsou žádné argumenty
_goto_usage
return
fi
subcommand="$1"
shift
case "$subcommand" v
-c|--cleanup)
_goto_cleanup "$@"
;;
-r|--register) # Zaregistrujte si alias
_goto_register_alias "$@"
;;
-u|--unregister) # Zrušit registraci aliasu
_goto_unregister_alias "$@"
; ;
_goto_directory_push "$@"
;;
-o|--pop) # Vytáhněte horní adresář z pushd stack, pak změňte tento adresář
_goto_directory_pop
;;
-l|--list)
_goto_list_aliases
;;
) -x|-- a # Rozbalte alias
_goto_expand_alias "$@"
;;
-h|--help)
_goto_usage
;;
-v|-- verze)
_goto_version
;;
*)
_ goto_directory "$subcommand"
;;
esac
vrátit $?
}
_goto_resolve_db()
{
GOTO_DB="${GOTO_DB:-$HOME/.goto}"
dotkněte se -a "$GOTO_DB"
}
_goto_usage()
{
kočka <<\USAGE
použití:goto [] [ ]
výchozí použití:
goto- změny adresáře registrovaného pro daný alias
MOŽNOSTI:
-r, --register:registruje alias
goto -r|--register
-u , --unregister:zruší registraci aliasu
goto -u|--unregister
-p, --push:vloží aktuální adresář do zásobníku a poté provede goto
goto - p|--push
-o, --pop:vybere horní adresář ze zásobníku a poté se přepne do tohoto adresáře
goto -o|--pop
-l, --list:vypíše aliasy
goto -l|--list
-x, --expand:rozbalí alias
goto -x|--expand
- c, --cleanup:vyčistí neexistující adresář aliasy
goto -c|--cleanup
-h, --help:vypíše tuto nápovědu
goto -h|--help
-v, --version:zobrazí verze goto skriptu
goto -v|--version
POUŽITÍ
}
# Zobrazí verzi
_goto_version()
{
echo "goto verze 1.2.4.1"
}
# Rozbalí adresář.
# Užitečné pro ~, ., .. cesty
_goto_expand_directory()
{
vestavěné cd "$1" 2>/dev/null &&pwd
}
# Vypíše registrované aliasy.
_goto_list_aliases()
{
local IFS=$' '
if [ -f "$GOTO_DB" ]; potom
při čtení -r název adresáře; do
printf '\e[1;36m%20s \e[0m%s\n' "$name" "$adresář"
hotovo <"$GOTO_DB"
else
echo "Ještě jste nenakonfigurovali žádné aliasy adresáře."
fi
}
# Rozbalí registrovaný alias.
_goto_expand_alias()
{
if [ "$#" -ne "1" ]; then
_goto_error "usage:goto -x|--expand"
return
fi
místní vyřešeno
vyřešeno=$(_goto_find_alias_directory "$1")
if [ -z "$vyřešeno" ]; potom
_goto_error "alias '$1' neexistuje"
return
fi
echo "$resolved"
}
# Zobrazí duplicitní aliasy adresáře
_goto_find_duplicate()
{
local duplicates=
duplicates=$(sed -n 's:[^ ]* '"$1 "'$:&:p' "$GOTO_DB" 2>/dev/null)
echo "$duplicates"
}
# Registry a alias.
_goto_register_alias()
{
if [ "$#" -ne "2" ]; then
_goto_error "usage:goto -r|--register"
return 1
fi
if ! [[ $1 =~ ^[[:alnum:]]+[a-zA-Z0-9_-]*$ ]]; potom
_goto_error "neplatný alias – může začínat písmeny nebo číslicemi, po nichž následují písmena, číslice, pomlčky nebo podtržítka"
return 1
fi
místní vyřešeno
resolved=$(_goto_find_alias_directory "$1")
if [ -n "$resolved" ]; potom
_goto_error "alias '$1' existuje"
return 1
fi
místní adresář
directory=$(_goto_expand_directory "$2")
if [ -z "$adresář" ]; potom
_goto_error "nepodařilo se zaregistrovat '$1' do '$2' - nelze cd do adresáře"
vrátit 1
fi
místní duplikát
duplicate=$(_goto_find_duplicate "$adresář")
if [ -n "$duplicate" ]; then
_goto_warning "nalezeny duplicitní alias(y):\\n$duplicate"
fi
# Připojit záznam k souboru.
echo "$1 $adresář">> "$GOTO_DB"
echo "Alias '$1' byl úspěšně zaregistrován."
}
# Zruší registraci daného aliasu.
_goto_unregister_alias()
{
if [ "$#" -ne "1" ]; then
_goto_error "usage:goto -u|--unregister"
return 1
fi
local resolved
resolved=$(_goto_find_alias_directory "$1")
if [ -z "$vyřešeno" ]; then
_goto_error "alias '$1' neexistuje"
return 1
fi
# shellcheck disable=SC2034
local readonly GOTO_DB_TMP="$HOME /.goto_"
# Smazat záznam ze souboru.
sed "/^$1 /d" "$GOTO_DB"> "$GOTO_DB_TMP" &&mv "$GOTO_DB_TMP" "$GOTO_DB"
echo "Alias '$1' byl úspěšně zrušen."
}
# Vloží aktuální adresář do zásobníku a poté přejde na
_goto_directory_push()
{
pokud [ "$#" -ne "1" ]; then
_goto_error "usage:goto -p|--push"
return
fi
{ pushd . || vrátit se; } 1>/dev/null 2>&1
_goto_directory "$@"
}
# Vybere horní adresář ze zásobníku a poté přejde
_goto_directory_pop()
{
{ popd || vrátit se; } 1>/dev/null 2>&1
}
# Zruší registraci aliasů, jejichž adresáře již neexistují.
_goto_cleanup()
{
if ! [ -f "$GOTO_DB" ]; potom
return
fi
while IFS=read -r i &&[ -n "$i" ]; do
echo "Uklízení:$i"
_goto_unregister_alias "$i"
hotovo <<<"$(awk '{al=$1; $1=""; dir=substr($0 ,2);
system("[ ! -d \"" dir "\" ] &&echo " al)}' "$GOTO_DB")"
}
# Změny v adresáři daného aliasu
_goto_directory()
{
local target
target=$(_goto_resolve_alias "$1") || return 1
vestavěné cd "$target" 2> /dev/null || \
{ _goto_error "Nepodařilo se přejít na '$target'" &&return 1; }
}
# Načte adresář aliasů.
_goto_find_alias_directory()
{
místní vyřešeno
vyřešeno=$( sed -n "s/^$1 \\(.*\\)/\\1/p" "$GOTO_DB" 2>/dev/null)
echo "$resolved"
}
# Zobrazí danou chybu.
# Používá se pro výstup běžné chyby.
_goto_error()
{
(>&2 echo -e "goto error:$1 ")
}
# Zobrazí dané varování.
# Používá se pro výstup běžného varování.
_goto_warning()
{
(> &2 echo -e "goto warning:$1")
}
# Zobrazí položky s aliasy začínajícími na daný.
_goto_print_similar()
{
místní podobné
podobné=$(sed -n "/^$1[^ ]* .*/p" "$GOTO_DB" 2>/dev/null)
if [ -n "$similar" ]; potom
(>&2 echo "Měli jste na mysli:")
(>&2 sloupec -t <<<"$similar")
fi
}
# Načte alias adresář, chyby, pokud neexistuje.
_goto_resolve_alias()
{
lokálně vyřešeno
resolved=$(_goto_find_alias_directory "$1")
if [ -z "$vyřešeno" ]; potom
_goto_error "unregistered alias $1"
_goto_print_similar "$1"
vrátit 1
else
echo "${resolved}"
fi
}
# Dokončí funkci goto dostupnými příkazy
_complete_goto_commands()
{
local IFS=$' \t\n'
# shellcheck disable=SC2207
COMPREPLY=($(compgen -W "-r --register -u --unregister -p --push -o --pop -l --list -x --expand -c --cleanup -v --version" -- "$1"))
}
# Dokončí funkci goto s dostupnými aliasy
_complete_goto_aliases()
{
local IFS=$'\n' odpovídá
_goto_resolve_db
# shellcheck disable=SC2207
odpovídá=($(sed -n "/^$1/) p" "$GOTO_DB" 2>/dev/null))
if [ "${#matches[@]}" -eq "1" ]; potom
# odeberte atribut názvů souborů z metody dokončení
compopt +o názvy souborů 2>/dev/null
# pokud najdete pouze jeden alias, nepřipojujte adresář
COMPREPLY=("${matches[0]// *}")
else
pro i v "${!matches[@]}"; do
# odeberte atribut názvů souborů z metody dokončení
compopt +o názvy souborů 2>/dev/null
if ! [[ $(uname -s) =~ Darwin* ]]; then
odpovídá[$i]=$(printf '%*s' "-$COLUMNS" "${matches[$i]}")
COMPREPLY+=("$(compgen -W "${matches[$i]}")")
else
COMPREPLY+=("${matches[$i]// */}")
fi
hotovo
fi
}
# Bash programovatelné dokončení pro funkci goto
_complete_goto_bash()
{
local cur="${ COMP_WORDS[$COMP_CWORD]}" předchozí
if [ "$COMP_CWORD" -eq "1" ]; then
# pokud jsme na prvním argumentu
if [[ $cur ==-* ]]; potom
# a spustí se jako příkaz, příkazové příkazy
_complete_goto_commands "$cur"
else
# a nespustí se jako příkaz, příkazové aliasy
_complete_goto_aliase $cur"
fi
elif [ "$COMP_CWORD" -eq "2" ]; potom
# pokud jsme u druhého argumentu
prev="${COMP_WORDS[1]}"
if [[ $prev ="-u" ]] || [[ $prev ="--unregister" ]]; potom
# zobrazí výzvu s aliasy, pokud se uživatel pokusí zrušit registraci jednoho
_complete_goto_aliases "$cur"
elif [[ $prev ="-x" ]] || [[ $prev ="--expand" ]]; potom
# zobrazí výzvu s aliasy, pokud se uživatel pokusí rozbalit jeden
_complete_goto_aliases "$cur"
elif [[ $prev ="-p" ]] || [[ $prev ="--push" ]]; then
# zobrazí výzvu s aliasy pouze v případě, že se uživatel pokusí vložit
_complete_goto_aliases "$cur"
fi
elif [ "$COMP_CWORD" -eq "3" ]; potom
# pokud jsme u třetího argumentu
prev="${COMP_WORDS[1]}"
if [[ $prev ="-r" ]] || [[ $prev ="--register" ]]; potom
# vyzve s adresáři pouze v případě, že se uživatel pokusí zaregistrovat alias
local IFS=$' \t\n'
# shellcheck disable=SC2207
COMPREPLY=($(compgen -d -- "$cur"))
fi
fi
}
# Zsh programovatelné dokončení pro funkci goto
_complete_goto_zsh ()
{
local all_aliases=()
while IFS=read -r line; do
all_aliases+=("$line")
hotovo <<<"$(sed -e 's/ /:/g' ~/.goto 2>/dev/null)"
local state
local -a options=(
'(1)'{-r,--register}'[registruje alias]:register:->register'
'(- 1 2)'{-u,--unregister}'[zruší registraci aliasu]:unregister:->unregister'
'(:-)'{-l,--list}'[seznamy aliasy]'
'(*)'{-c,--cleanup}'[vyčistí neexistující aliasy adresáře]'
'(1 2)'{-x,--expand}'[ rozbalí alias]:expand:->aliases'
'(1 2)'{-p,--push}'[vloží aktuální adresář do zásobníku a poté provede goto]:push:->aliases'
'(*)'{-o,--pop}'[zobrazí horní adresář ze zásobníku a poté se přepne do tohoto adresáře]'
'(:-)'{-h,--help }'[vytiskne tuto nápovědu]'
'(* -)'{-v,--version}'[zobrazí verzi skriptu goto]'
)
_arguments -C \
"${options[@]}" \
'1:alias:->aliasy' \
'2:dir:_files' \
&&ret =0
případ ${state} v
(aliasy)
_describe -t aliasy 'goto aliasy:' all_aliases &&ret=0
;;
(zrušit registraci)
_describe -t aliasy 'unregister alias:' all_aliases
;;
esac
return $ret
}
goto_aliases=($(alias | sed -n "s/.*\s\(.*\)='goto'/\1/p"))
goto_aliases+=("goto")
pro i v "${goto_aliases[@]}"
do
# Zaregistrujte dokončení goto.
if [ -n "${BASH_VERSION}" ]; pak
pokud ! [[ $(uname -s) =~ Darwin* ]]; potom
dokončete -o názvy souborů -F _complete_goto_bash $i
else
dokončete -F _complete_goto_bash $i
if SH n - " $ br potom
compdef _complete_goto_zsh $i
else
echo "Nepodporovaný shell."
ukončení 1
fi udělejte
Toto bylo původně publikováno jako README v úložišti GitHub goto a je znovu použito se svolením.
Linux