Как сделать так, чтобы клавиши со стрелками вверх и вниз отображали записи истории в скрипте с помощью 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. Кроме того, я хочу, чтобы история исходила не из оболочки, а из ввода, который вводится в скрипт.


person nachocab    schedule 02.09.2015    source источник


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

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

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

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

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

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

person Francisco    schedule 08.09.2015
comment
Спасибо за ответ! setopt interactive не работает. - person nachocab; 08.09.2015
comment
действительно это не работает. Этот флаг нельзя установить после запуска оболочки. Я внес небольшую правку в сценарий. В любом случае, вам действительно следует использовать обычную интерактивную оболочку, без файлов конфигурации. - person Francisco; 09.09.2015
comment
Хм, это все еще не работает (у меня OSX, и я получаю звуковой сигнал, когда использую клавиши со стрелками). Причина, по которой я не запускаю его как новую оболочку, заключается в том, что это всего лишь игрушечный пример. Фактический скрипт делает другие вещи с пользовательским вводом. - person nachocab; 09.09.2015
comment
Добавьте хук с add-zsh-hook и добавьте вызов функции к командам или просто выполните что-нибудь при добавлении в историю. - person Francisco; 09.09.2015