2015-09-02 46 views
11

this answer所示,它可以使用read與Readline庫(-e)在bash使用上下鍵到以前的歷史項恢復:如何使用zsh在腳本中顯示歷史記錄條目的向上和向下箭頭鍵?

#! /usr/bin/env bash 

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

什麼是zsh來做到這一點的正確方法? (在循環中獲取用戶輸入並允許上/下鍵歷史記錄完成)。這是行不通的:

#! /usr/bin/env zsh 

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

done 

我認爲默認情況下zsh中的腳本禁用了歷史記錄完成。另外,我不希望歷史來自shell,而是來自腳本中輸入的輸入。

回答

2

我想你問這些方針的東西...... 未經檢驗

#! /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 

[編輯] 通知我加-i第一行(#!)。這只是一種表明shell必須以交互模式運行的方式。達到此目的的最佳方式是 只需執行腳本zsh -i my-script.zsh,因爲在Linux和OSX之間傳遞參數到#!命令不同,所以它原則上是不應該依賴的。

老實說,你爲什麼不直接用一些自定義配置啓動一個新的交互式shell,並且(如果有必要)在命令之間掛鉤?實現這一目標的最好方法很可能就是使用不同的配置文件啓動一個新的shell,創建一個新的歷史記錄。

這是一個更好的方法來做到這一點:

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

然後你可以改變腳本的配置文件來執行你需要的任何其他自定義(不同顏色的提示,節省沒有歷史等)。

要真正做的事情與用戶輸入時,應使用處理的許多掛鉤的一個由add-zsh-hook

+0

感謝您的回答! 'setopt interactive'不起作用。 – nachocab

+0

確實不起作用。一旦shell啓動並運行,該標誌就不能設置。我對劇本做了一些小小的修改。無論如何,你真的應該只是使用一個普通的交互式shell,沒有配置文件 – Francisco

+0

嗯,它仍然不起作用(我在OSX上,當我使用箭頭鍵時,我聽到一聲嘟嘟聲)。我沒有將它作爲新shell運行的原因是因爲這僅僅是一個玩具的例子。實際的腳本通過用戶輸入來做其他事情。 – nachocab

相關問題