Как сделать клавиши со стрелками вверх и вниз отображать записи истории в script с помощью zsh?

Как показано в этом ответе, можно использовать read с Readline (-e) в bash, чтобы возвращать предыдущие элементы истории, используя и вниз:

#! /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. Кроме того, я не хочу, чтобы история появилась из оболочки, но из ввода, введенного в script.

Ответ 1

Я думаю, что вы просите что-то в этом направлении... непроверенный

#! /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] Заметьте, я добавил -i в первую строку (#!). Это всего лишь способ указать, что оболочка должна работать в интерактивном режиме. Лучший способ добиться этого - просто выполните script с помощью zsh -i my-script.zsh, поскольку передача аргументов в команды #! отличается от Linux и OSX, поэтому в принципе не стоит полагаться.

Честно говоря, почему бы вам не начать новую интерактивную оболочку, используя какую-то настраиваемую конфигурацию и (при необходимости) перехваты между командами? Лучший способ достичь этого - скорее всего, просто запустит новую оболочку, используя разные конфигурационные файлы, новую историю.

Это намного лучший способ сделать это:

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

вы можете изменить конфигурационный файл script для выполнения любой другой настройки, в которой вы нуждаетесь (разное приглашение цвета, отсутствие сохранения истории и т.д.).

Чтобы на самом деле делать что-то с пользовательским вводом, вы должны использовать один из многих крючков, обрабатываемых add-zsh-hook