2015-09-02 9 views
11

Come mostrato nella this answer, è possibile utilizzare read con Readline (-e) in bash per restituire gli elementi della cronologia precedente utilizzando i tasti su e giù:Come impostare i tasti freccia su e giù per mostrare le voci della cronologia in uno script usando zsh?

#! /usr/bin/env bash 

while IFS="" read -p "input> " -e line; do 
    history -s "$line" # append $line to local history 
done 

Qual è il modo giusto per fare questo in zsh? (ottenendo l'input dell'utente su un loop e consentendo il completamento della cronologia dei tasti su/giù). Questo non funziona:

#! /usr/bin/env zsh 

while IFS="" vared -p "input> " -c line; do 

done 

Penso che il completamento della cronologia sia disabilitato di default sugli script in zsh. Inoltre, non voglio che la cronologia provenga dalla shell, ma dall'input immesso nello script.

risposta

2

Penso che stai chiedendo qualcosa in questo senso ... non testato

#! /bin/zsh -i 

local HISTFILE 
# -p push history list into a stack, and create a new list 
# -a automatically pop the history list when exiting this scope... 
HISTFILE=$HOME/.someOtherZshHistoryFile 
fc -ap # read 'man zshbuiltins' entry for 'fc' 

while IFS="" vared -p "input> " -c line; do 
    print -S $line # places $line (split by spaces) into the history list... 
done 

[EDIT] Avviso ho aggiunto -i alla prima linea (#!). È semplicemente un modo per indicare che la shell deve essere in esecuzione in modalità interattiva. Il modo migliore per farlo è semplicemente eseguire lo script con zsh -i my-script.zsh, perché passare gli argomenti ai comandi #! differisce tra Linux e OSX, quindi è in linea di principio qualcosa su cui uno non dovrebbe fare affidamento.

Onestamente, perché non si avvia una nuova shell interattiva utilizzando alcune configurazioni personalizzate e (se necessario) ganci tra i comandi? È probabile che il modo migliore per farlo sia avviare una nuova shell utilizzando una nuova cronologia con diversi file di configurazione.

questo è un modo molto migliore per fare questo:

mkdir ~/abc 
echo "export HISTFILE=$HOME/.someOtherZshHistoryFile;autoload -U compinit; compinit" >! ~/abc/.zshrc 
ZDOTDIR=~/abc/ zsh -i 

è quindi possibile modificare file di configurazione dello script di eseguire qualsiasi altra personalizzazione è necessario (prompt colore diverso, risparmiando senza storia, ecc).

effettivamente fare le cose con l'input dell'utente, è necessario utilizzare uno dei tanti ganci gestiti da add-zsh-hook

+0

Grazie per la risposta! 'setopt interactive' non funziona comunque. – nachocab

+0

in effetti non funziona. Quel flag non può essere impostato una volta che la shell è attiva e funzionante. Ho apportato una leggera modifica alla sceneggiatura. In ogni caso, dovresti semplicemente usare una normale shell interattiva, senza file di configurazione – Francisco

+0

Hmm, non funziona ancora (sono su OSX e ricevo un segnale acustico quando uso i tasti freccia). Il motivo per cui non lo sto eseguendo come una nuova shell è perché questo è solo un esempio di giocattolo. Lo script effettivo fa altre cose con gli input dell'utente. – nachocab

Problemi correlati