我已阅读解决方案在多个终端窗口中保留 bash 历史记录 我正在寻找以下妥协:
- 所有并发会话中的命令
bash
在执行后都会附加到一个共享文件中 - Ctrl+r在一个会话中查找来自其他会话的命令
- 在一个会话中按Up/Down仅有的循环执行该会话中的命令。
这可能吗bash
?如果没有,zsh
也许?
答案1
我在尝试实现类似目标时偶然发现了这个问题。我相信以下内容可以解决您的问题:
使用文件来记录所有执行的命令。感谢 Eli Bendersky 的贡献邮政,我按原样使用他的代码,唯一的变化是在
$PERSISTENT_HISTORY_FILE
.安装弗兹夫使用键绑定(我不确定通过包管理器安装是否设置键绑定,但通过 git 和安装脚本可以)。
__fzf_history
将函数更改fzf/shell/key-bindings.bash
为:
__fzf_history__() {
local output opts script
opts="--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore ${FZF_DEFAULT_OPTS-} -n2..,.. --scheme=history --bind=ctrl-r:toggle-sort ${FZF_CTRL_R_OPTS-} +m --read0"
script='BEGIN { $/ = "\n"; $HISTCOUNT = $ENV{last_hist} + 1 } s/^[ *]//; print $HISTCOUNT - $. . "\t$_" if !$seen{$_}++'
output=$(
tac $PERSISTENT_HISTORY_FILE |
last_hist=$(HISTTIMEFORMAT='%F %T ' builtin history 1) perl -n -l0 -e "$script" |
FZF_DEFAULT_OPTS="$opts" $(__fzfcmd) --query "$READLINE_LINE"
) || return
READLINE_LINE=${output#*| }
if [[ -z "$READLINE_POINT" ]]; then
echo "$READLINE_LINE"
else
READLINE_POINT=0x7fffffff
fi
}
显然,您可以创建自己的函数,从 fzf 细节中剥离上面的代码并将其绑定到 ctrl+r。